题意:在给定的时间和每首歌的时间下,求最多能唱几首歌,在最多首歌的情况下最多能唱多少时间。
思路:每首歌选或不选,0-1背包。
在满足歌的数量最多的情况下,比较时间,具体代码体现在,先比较歌曲数目,在歌曲数目相同的情况下,比较时间。
状态一定要倒序,同一个阶段的状态不能互相推导(一首歌不能加2次)。
#includeusing namespace std;#define maxn 180*55+678int 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 >num[i]; for(int i=0;i =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]