题目看起来是一道简单的0-1背包问题,不过还是挂了很多次。题目要求优先歌曲数目,其次是歌曲时间,采用双层动态规划结构就行,先判断歌曲数目最优,歌曲数目相同时就判断歌曲时间最优。 开始时用了二维数组,结果一直超时,两个全用了滚动数组就行了。另外有一点注意的就是索然题目说明t>=10^9,实际上t不会超过180n+678。
下面贴上代码
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 100000
int dp[maxn],d[maxn];
int main()
{
// freopen("input.txt","r",stdin);
int q;
scanf("%d",&q);
for(int w=1;w<=q;w++)
{
int n,t,i,j,a[51];
scanf("%d%d",&n,&t);
memset(dp,0,sizeof(dp));
memset(d,0,sizeof(d));
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
for(j=t-1;j>=a[i];j--)
{
if(dp[j]<dp[j-a[i]]+1){
dp[j]=dp[j-a[i]]+1;
d[j]=a[i]+d[j-a[i]];
}
else if(dp[j]==dp[j-a[i]]+1){
d[j]=max(d[j-a[i]]+a[i],d[j]);
}
}
}
printf("Case %d: %d %d\n",w,dp[t-1]+1,d[t-1]+678);
}
return 0;
}