一开始竟然读错了题意,没有注意到歌曲数量优先这个条件。。。。
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int T;
int n,t;
int a[100];
int f[55][9005];
int d[55][9005];
int main()
{
scanf("%d",&T);
int kase = 1;
while(T--)
{
scanf("%d%d",&n,&t);
for(int i = 1; i <= n; ++i)
scanf("%d",&a[i]);
memset(f,0,sizeof(f));
memset(d,0,sizeof(d));
for(int i = 1; i <= n; ++i)
{
for(int j = 1; j <= t; ++j)
{
d[i][j] = d[i - 1][j];
f[i][j] = f[i - 1][j];
if(j >= a[i])
{
if(d[i][j] < d[i - 1][j - a[i]] + 1){
d[i][j] = d[i - 1][j - a[i]] + 1;
f[i][j] = f[i - 1][j - a[i]] + a[i];
}
else if(d[i][j] == d[i - 1][j - a[i]] + 1)
f[i][j] = max(f[i - 1][j],f[i - 1][j - a[i]] + a[i]);
}
}
}
printf("Case %d: %d %d\n",kase++,d[n][t - 1] + 1,f[n][t - 1] + 678);
}
return 0;
}