注意点:
cin>>W>>N; FOR(i,1,N) { cin>>a[i].wei>>a[i].val; } FOR(i,1,N) { dp[i][0]=0; } FOR(i,1,W) { dp[0][i]=0; } FOR(i,1,N) FOR(j,1,W) { /*if(a[i].wei>j) { dp[i][j]=dp[i-1][j]; } else { dp[i][j]=max(dp[i-1][j-a[i].wei]+a[i].val,dp[i-1][j]); }*/ dp[i][j] = dp[i-1][j]; if(a[i].wei>j) continue; if(a[i].val+dp[i-1][j-a[i].wei]>dp[i-1][j]) dp[i][j] = a[i].val+dp[i-1][j-a[i].wei]; } cout<<dp[N][W];
3:for(int i=N,w=W;i>=1;i--) { if(G[i][w]==diagonal) { cout<<i<<endl; w-=a[i].wei; } }
补充另一个背包问题,填充型背包
https://www.luogu.org/problemnew/show/P1049 没拐弯
cin>>M>>N; FOR(i,1,N) { cin>>v[i]; } for(int i=1;i<=N;++i) for(int j=M;j>=v[i];--j) { f[j]=max(f[j],f[j-v[i]]+v[i]); } cout<<M-f[M];
原文:https://www.cnblogs.com/jrfr/p/10352579.html