题意:给出歌曲数,限制时长,最后要留一分钟放一首678时长的歌,然后现在要求放的歌曲数最多(首要条件),放的歌曲时长最长(次要条件),最后输出歌曲总数以及歌曲总时长。
题解:刚开始看了一下数据范围1e9,还以为超大背包啥的,最后看了下,最多50首歌,一首歌最多180分钟,意思是放完最多也就9000秒,然后可以使用dp[i]表示放了i分钟最多放的歌数,直接使用那种填满背包的套路做就可以了,最后输出需要的答案即可。
附上代码:
#include<bits/stdc++.h>
using namespace std;
const int maxt=1e4+5;
const int maxn=50+5;
int n,V;
int vol[maxn];
int dp[maxt];
int main()
{
int T;
scanf("%d",&T);
int casen=1;
while(T--){
int n,t;
scanf("%d%d",&n,&t);
for(int i=0;i<n;i++){
scanf("%d",&vol[i]);
}
memset(dp,0,sizeof(dp));
int ans=0;
for(int i=0;i<n;i++){
for(int j=min(t-1,maxt);j>=vol[i];j--){
if(dp[j-vol[i]]||j-vol[i]==0){
dp[j]=max(dp[j],dp[j-vol[i]]+1);
ans=max(ans,dp[j]);
}
}
}
int flag=0;
for(int i=min(t-1,maxt);i>=1;i--){
if(ans==dp[i]&&dp[i]!=0){
flag=1;
printf("Case %d: %d %d\n",casen++,ans+1,i+678);
break;
}
}
if(!flag){
printf("Case %d: %d %d\n",casen++,1,678);
}
}
return 0;
}