题目:https://vjudge.net/contest/240161#problem/G
01背包问题;
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
int T;
int n,mt;
int len[55];
int main()
{
//f[j]到时间j为止,背包中可以装的东西数/
scanf("%d",&T);
int Case=0;
while(T--)
{
scanf("%d%d",&n,&mt);
for(int i=1;i<=n;i++)
scanf("%d",&len[i]);
int f[10000];
memset(f,-1,sizeof(f));
f[0]=0;
for(int i=1;i<=n;i++)
for(int j=mt-1;j>=len[i];j--)
f[j]=max(f[j],f[j-len[i]]+1);//就地滚动
int ans=0;
int pos=-1;
for(int i=mt-1;i>=0;i--)
if(pos<f[i])
{
pos=f[i];
ans=i;
}
printf("Case %d: %d %d\n",++Case,pos+1,ans+678);
}
return 0;
}