標籤:動態規劃
錯的我真是無語。。。還是狀態的把握不準確。。
起始狀態轉移方程是很重要,但是只推出了方程是不夠的
對邊界狀態的處理,對特殊狀態的處理,這些都很重要,錯了任何一個小地方,都會導致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;}