错的我真是无语。。。还是状态的把握不准确。。
起始状态转移方程是很重要,但是只推出了方程是不够的
对边界状态的处理,对特殊状态的处理,这些都很重要,错了任何一个小地方,都会导致WA....
细节!更清晰的思路,更全面的考虑!
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,t;
int v[55];
int d[55][10000];
int path[55][10000];
int main()
{
int tt;
scanf("%d",&tt);
for(int kase=1;kase<=tt;kase++)
{
scanf("%d%d",&n,&t);
memset(path,0,sizeof(path));
memset(d,0,sizeof(d));
memset(v,0,sizeof(v));
for(int i=1;i<=n;i++)
{
scanf("%d",&v[i]);
}
for(int i=n;i>=1;i--)
{
for(int j=0;j<=t;j++)
{
d[i][j]=(i==n)?0:d[i+1][j];
path[i][j]=path[i+1][j];
if(j>=v[i])
{
if(d[i][j]<d[i+1][j-v[i]]+1)
{
path[i][j]=v[i]+path[i+1][j-v[i]];
d[i][j]=d[i+1][j-v[i]]+1;
}
else if(d[i][j]==d[i+1][j-v[i]]+1)
path[i][j]=max(path[i+1][j-v[i]]+v[i],path[i+1][j]);
}
}
}
int max_=-1;
for(int i=t-1;i>=0;i--)
{
if(d[1][i]==d[1][t-1])
{
if(max_<path[1][i])
max_=path[1][i];
}
}
printf("Case %d: %d %d\n",kase,d[1][t-1]+1,max_+678);
}
return 0;
}