一个简单的0-1背包,背包容量为t-1,每个物品价值为1,代价为t[i]。背包容量为t-1而不是t的原因是留1s唱《劲歌金曲》。
AC代码:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=180*50+678+5; struct node{ int len,tim; node(){ } node(int l,int t):len(l),tim(t){ } }dp[55][maxn]; int a[55]; int n,t; int main(){ int T,kase=0; scanf("%d",&T); while(T--){ scanf("%d%d",&n,&t); for(int i=1;i<=n;++i) scanf("%d",&a[i]); memset(dp[0],0,sizeof(dp[0])); for(int i=1;i<=n;++i) for(int j=0;j<t;++j){ if(i==1) dp[i][j]=node(0,0); else dp[i][j]=dp[i-1][j]; if(j>=a[i]){ if(dp[i-1][j-a[i]].len+1>dp[i][j].len) { dp[i][j].len=dp[i-1][j-a[i]].len+1; dp[i][j].tim=dp[i-1][j-a[i]].tim+a[i]; } else if(dp[i-1][j-a[i]].len+1==dp[i][j].len){ dp[i][j].tim=max(dp[i-1][j-a[i]].tim+a[i],dp[i][j].tim); } } } printf("Case %d: ",++kase); printf("%d %d\n",dp[n][t-1].len+1,dp[n][t-1].tim+678); } return 0; }
可以用滚动数组优化内存。
可能我的代码思路不是很简洁明了,附上汝佳大哥的代码汝佳大哥代码
如有不当之处欢迎指出。