错的我真是无语。。。还是状态的把握不准确。。
起始状态转移方程是很重要,但是只推出了方程是不够的
对边界状态的处理,对特殊状态的处理,这些都很重要,错了任何一个小地方,都会导致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; }
uva 12563 - Jin Ge Jin Qu hao(动态规划~劲!歌!金!曲!)
时间: 2024-10-22 01:07:37