uva12563 0-1背包
题意:在给定的时间和每首歌的时间下,求最多能唱几首歌,在最多首歌的情况下最多能唱多少时间。
思路:每首歌选或不选,0-1背包。
在满足歌的数量最多的情况下,比较时间,具体代码体现在,先比较歌曲数目,在歌曲数目相同的情况下,比较时间。
状态一定要倒序,同一个阶段的状态不能互相推导(一首歌不能加2次)。
#include<bits/stdc++.h> using namespace std; #define maxn 180*55+678 int d[maxn]; int p[maxn]; int num[55]; int main() { int T,cas=0; cin>>T; while(T--) { int n,t; cin>>n>>t; memset(num,0,sizeof(num)); memset(d,0,sizeof(d)); memset(p,0,sizeof(p)); for(int i=0;i<n;i++) cin>>num[i]; for(int i=0;i<n;i++)//阶段 for(int j=t-1;j>=num[i];j--)//状态 { int tmp=d[j-num[i]]+1; if(tmp>d[j]) { d[j]=tmp; p[j]=p[j-num[i]]+num[i]; } else if(tmp==d[j]) { if(p[j]<p[j-num[i]]+num[i]) p[j]=p[j-num[i]]+num[i]; } } cas++; cout<<"Case "<<cas<<": "<<d[t-1]+1<<" "<<p[t-1]+678<<endl; } }