题意:见紫书。
题解:一道裸的01背包,但是有一个地方有点坑,题目说的是t有10^9,但事实上,t最多只能有180*n+678
code:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
const int MAXN=55;
const int MAXM=10005;
using namespace std;
int T,dp[MAXN][MAXM],len[MAXN];
int n,t,num[MAXN][MAXM];
int main()
{
scanf("%d",&T);
for(int cas=1;cas<=T;cas++)
{
scanf("%d%d",&n,&t);
for(int i=1;i<=n;i++)
scanf("%d",&len[i]);
memset(num,0,sizeof num);
memset(dp,0,sizeof dp);
for(int i=1;i<=n;i++)
for(int j=0;j<t;j++)
{
num[i][j]=num[i-1][j];
dp[i][j]=dp[i-1][j];
if(j>=len[i])
{
if(num[i][j]<num[i-1][j-len[i]]+1)
{
dp[i][j]=dp[i-1][j-len[i]]+len[i];
num[i][j]=num[i-1][j-len[i]]+1;
}
else if(num[i][j]==num[i-1][j-len[i]]+1)
dp[i][j]=max(dp[i][j],dp[i-1][j-len[i]]+len[i]);
}
}
printf("Case %d: ",cas);
printf("%d %d\n",num[n][t-1]+1,dp[n][t-1]+678);
}
}