题目描述
01背包问题,要求在装的多的情况下尽可能满。
滚动数组压缩空间。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
using namespace std;
const int maxt=50*180+678+10;
int f[maxt+2],d[maxt+2];
int v[55];
int main(){
int kase,k=0;
cin>>kase;
while(kase--){
int n,t;
scanf("%d%d",&n,&t);
for(int i=1;i<=n;i++) scanf("%d",&v[i]);
memset(f,0,sizeof(f));
memset(d,0,sizeof(d));
t=min(t,maxt);
for(int i=1;i<=n;i++)
for(int j=t;j>=0;j--)
if(j-v[i]>0&&(d[j-v[i]]+1>d[j]||(d[j-v[i]]+1==d[j]&&f[j-v[i]]+v[i]>f[j])))
f[j]=f[j-v[i]]+v[i],d[j]=d[j-v[i]]+1;
printf("Case %d: %d %d\n",++k,d[t]+1,f[t]+678);
}
return 0;
}