题目大意:有n首歌,m个光盘,每个光盘最多能放t时间的歌,给出每首歌的长度,必须按顺序录入光盘(可以选择不录某几首歌),最多能录多少首歌。

用d[i][j][0]表示前i首歌,放j首,最少用多少个光盘,用d[i][j][1]表示前i首歌,放j首,在光盘最少的前提下,最后一个光盘可以剩余的最多容量。根据是否放第i首歌完成递推。

这样递推是正确的,因为前i首歌,放j首的情况下,最佳的情况就是尽量少的用光盘,并且使得最后一个光盘容量尽量大(例如如果用的光盘数多一些,并且最后一个光盘的容量更大一些,这样的情况不如前面的好)。在程序中使用了滚动数组优化内存。

状态转移方程:

若d[i-1][j][1]>=a[i],则若放i,光盘数不变,剩余容量变少,

若d[i-1][j][1]<a[i],则若放i,光盘数加1,剩余容量为v-a[i]。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int a[1530];
int d[2][1530][2];
char e[100010];
int main(void)
{int i,j,v,n,m,pi,qi,p1,p2,minp1,minp2,sump,top,lo,cur,ans;scanf("%d",&pi);for(qi=1;qi<=pi;qi++){scanf("%d%d%d",&n,&v,&m);while(getchar()==' '){;}gets(e+1);lo=strlen(e+1);top=0;i=1;while(i<=lo){if((e[i]>='0')&&(e[i]<='9')){sump=0;while((e[i]>='0')&&(e[i]<='9')){sump=sump*10+e[i]-'0';i++;}top++;a[top]=sump;}else{i++;}}cur=1;for(i=1;i<=n;i++){cur^=1;if(d[cur^1][i-1][1]>=a[i]){d[cur][i][0]=d[cur^1][i-1][0];d[cur][i][1]=d[cur^1][i-1][1]-a[i];}else{d[cur][i][0]=d[cur^1][i-1][0]+1;d[cur][i][1]=v-a[i];}for(j=1;j<i;j++){minp1=d[cur^1][j][0];minp2=d[cur^1][j][1];if(d[cur^1][j-1][1]>=a[i]){p1=d[cur^1][j-1][0];p2=d[cur^1][j-1][1]-a[i];if((p1<minp1)||((p1==minp1)&&(p2>minp2))){minp1=p1;minp2=p2;}}else{p1=d[cur^1][j-1][0]+1;p2=v-a[i];if((p1<minp1)||((p1==minp1)&&(p2>minp2))){minp1=p1;minp2=p2;}}d[cur][j][0]=minp1;d[cur][j][1]=minp2;}}ans=0;for(i=n;i>=1;i--){if(d[cur][i][0]<=m){ans=i;break;}}printf("%d\n",ans);if(qi!=pi){printf("\n");}}return 0;
}

UVA 473-Raucous Rockers(DP)相关推荐

  1. Uva 1625 - Color Length(DP)

    题目链接 https://cn.vjudge.net/problem/UVA-1625 [题意] 输入两个长度分别为n和m的颜色序列(n,m<=5000),要求按一定规则合并成一个序列,规则是每 ...

  2. UVA 473——Raucous Rockers

    题意:给定n个数,放到m个容器里,每个容器的容量是t(n个数的累加和不超过t),在不打乱放的顺序的情况下问最多能放多少个数? 思路:多维dp,f[i][j[k]表示前i个数放到第j个容器放k个的最大数 ...

  3. 【UVa】Wavio Sequence(dp)

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  4. UVA 662 Fast Food(dp)

    题意: 一条直线马路上有n个餐馆,各个餐馆的坐标为di. 现在要在这n个餐馆中选择k个餐馆用来建造仓库. 没有仓库的餐馆,只能使用附近最近的一个仓库. 问总距离最少的建造方案,并输出. 思路: 先进行 ...

  5. 求三角形最大面积(DP)

    求三角形最大面积(DP) 在OJ上奇迹般WA了:WA:70. Why? #include <iostream> #include <string.h> using namesp ...

  6. LeetCode 编辑距离 II(DP)

    1. 题目 给你两个单词 s 和 t,请你计算出将 s 转换成 t 所使用的最少操作数. 你可以对一个单词进行如下两种操作: 删除一个字符 替换一个字符 注意: 不允许插入操作 题目保证有解 示例: ...

  7. LeetCode 1220. 统计元音字母序列的数目(DP)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个整数 n,请你帮忙统计一下我们可以按下述规则形成多少个长度为 n 的字符串: - 字符串中的每个字符都应当是小写元音字母('a', 'e', 'i ...

  8. LeetCode 265. 粉刷房子 II(DP)

    文章目录 1. 题目 2. 解题 1. 题目 假如有一排房子,共 n 个,每个房子可以被粉刷成 k 种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同. 当然,因为市场上不同颜色油 ...

  9. LeetCode 256. 粉刷房子(DP)

    文章目录 1. 题目 2. 解题 1. 题目 假如有一排房子,共 n 个,每个房子可以被粉刷成红色.蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其与相邻的两个房子颜色不能相同. 当然,因 ...

  10. LeetCode 1223. 掷骰子模拟(DP)

    1. 题目 有一个骰子模拟器会每次投掷的时候生成一个 1 到 6 的随机数. 不过我们在使用它时有个约束,就是使得投掷骰子时,连续 掷出数字 i 的次数不能超过 rollMax[i](i 从 1 开始 ...

最新文章

  1. 装完sql后修改计算机名后不能进行发布的订阅的解决办法
  2. iptables 网址转译 (Network Address Translation,NAT)
  3. 使用java导入某个msn帐号的好友列表并发送消息
  4. Android 中 RegistrantList消息处理机制 以android 5.0 MT为例
  5. [MEGA DEAL] Ultimate Java开发和认证指南(59%折扣)
  6. leaflet 结合 Echarts4 实现散点图(附源码下载)
  7. 权限管理系统之用户管理
  8. java httpclient form_Java后台使用httpclient入门HttpPost请求(form表单提交,File文件上传和传输Json数据)...
  9. 包装类(Wrapper)的使用
  10. python 执行shell 事务_python中执行shell的两种方法总结
  11. viso 画背景框_手工界新宠:美绝了的浮雕画,揉揉捏捏一幅画
  12. python模块--subprocess
  13. 资源 | 忘了Python关键语句?这份备忘录拯救你的记忆
  14. mysql 通过ssh通道安全连接数据库
  15. SQL Server compute [by]
  16. 知识图谱属性融合_知识图谱融合_本体概念层的融合方法与技术
  17. 小数据集训练深度网络的小技巧
  18. js鼠标经过切换图片
  19. Linux对文本查找、检索、统计及替换的常用命令
  20. 市场营销环境分析的方法

热门文章

  1. Inverting Visual Representations with Convolutional Networks论文理解
  2. 小程序input textarea 禁止粘贴实现
  3. AM3352的I2C驱动与传感器sht20的应用
  4. 千兆路由器怎么设置网速最快_千兆路由器体验:速度简直太快了
  5. Python的学习笔记案例4--52周存钱挑战5.0
  6. 千古第一文人苏轼的众CP
  7. IPMI 服务器远程管理方法
  8. MATLAB的bertool绘制误码率理论值与仿真值对比曲线
  9. 构建会员运营管理系统 帮助零售企业数字化转型
  10. 金融计算机加权平均,什么是加权平均