题意:
已知想唱的歌曲n和剩余时间t,和每首歌的时间a[i],以及一首能唱很久的jingejin,求最多能唱歌数和唱歌时间。
规定每首歌开唱后不被打断,开唱后必须唱完,且只能唱一次。
样例举例了最好每次留一分钟去开始jingejin。
题解:
使用两个背包,一个b[i]存唱的时间,一个c[i]存唱的数量。
注意1时间范围是骗人的,50首各3分钟没那么久
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int N,n,time,cnt=0;
cin>>N;
while(N--){
cin>>n>>time;
int a[55],b[10000]={0},c[10000]={0},mn=0,tn;
for(int i=0;i<n;i++)cin>>a[i];
sort(a,a+n);
for(int i=0;i<n;i++){
for(int j=time-1;j>=a[i];j--){
if(c[j]<c[j-a[i]]+1||(c[j]==c[j-a[i]]+1&&b[j]<b[j-a[i]]+a[i])){
b[j]=b[j-a[i]]+a[i];
c[j]=c[j-a[i]]+1;
}
}
}
if(time>0){tn=b[time]+678;mn=c[time]+1;}
cout<<"Case "<<++cnt<<": "<<mn<<' '<<tn<<endl;
}
}
。
注意2先判断唱歌数目,再判断唱歌时间。