注意事项:0-1背包的转化,题目说t<=1e9,但是一共有n首歌(n<=50),每首歌不超过30分钟,所有n+1首歌的总长度严格大于t,也就是说t不会超过180n+678
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define INF 0x3f3f3f3f
#define mod 1000000007;
using namespace std;
const int maxn = 9678 + 2;
int n,t,a[maxn],d[maxn],f[maxn];
int main()
{
int T; scanf("%d",&T);
for(int kase = 1;kase <= T;kase++)
{
memset(d,0,sizeof(d));
memset(f,0,sizeof(f));
scanf("%d%d",&n,&t);
for(int i = 1;i <= n;i++)
{
scanf("%d",&a[i]);
for(int j = t - 1;j >= 0;j--)
{
if(j >= a[i])
{
if(f[j - a[i]] + 1 > f[j] || (f[j - a[i]] + 1 == f[j] && d[j] < d[j - a[i]] + a[i]))
{
f[j] = f[j - a[i]] + 1;
d[j] = d[j - a[i]] + a[i];
}
}
}
}
printf("Case %d: %d %d\n",kase,f[t - 1] + 1,d[t - 1] + 678);
}
return 0;
}