标签:
题意:
KTV里面有n首歌曲你可以选择,每首歌曲的时长都给出了. 对于每首歌曲,你最多只能唱1遍. 现在给你一个时间限制t (t<=10^9) , 问你在最多t-1秒的时间内可以唱多少首歌曲num , 且最长唱歌时间是多少time (time必须<=t-1) ? 最终输出num+1 和 time+678 即可.
注意: 你需要优先让歌曲数目最大的情况下,再去选择总时长最长的.
//0 KB 39 ms #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int dp[21000][2]; // 背包内容有两个,唱的歌曲数优先,唱的时间长其次 //容量最大是50*180+678,所以设成21000 int main() { int _; int cnt=0; scanf("%d",&_); while(_--){ memset(dp,0,sizeof(dp)); int n,t; scanf("%d%d",&n,&t); for(int i=1;i<=n;i++){ int v; scanf("%d",&v); //现学现用,0,1背包正向循环边输入边处理即可 for(int j=t-1;j>=0;j--){ if(j>=v) { if(dp[j][0]<dp[j-v][0]+1){ dp[j][0]=dp[j-v][0]+1; dp[j][1]=dp[j-v][1]+v; } if(dp[j][0]==dp[j-v][0]+1){ //当唱的歌曲数一样时就去松弛唱的时间长度 if(dp[j][1]<dp[j-v][1]+v) dp[j][1]=dp[j-v][1]+v; } } } } printf("Case %d: %d %d\n",++cnt,dp[t-1][0]+1,dp[t-1][1]+678); } return 0; }
UVA 12563 Jin Ge Jin Qu hao(01背包变形:两个背包内容)
标签:
原文地址:http://blog.csdn.net/kalilili/article/details/43868797