这次一定要记住 0-1背包
2018-04-03 11:41
260 查看
马上就要校赛了,也不能太水了吧,把学过的再自己打一边
这次一个字的书也不看 - -!
A - Charm Bracelet POJ - 3624
然后是逆向的 - -
推重量
一维数组
$(".MathJax").remove();
这次一个字的书也不看 - -!
A - Charm Bracelet POJ - 3624
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> using namespace std; int n,W; int dp[3500][3500]; int w[3500]; int v[3500]; void solve(){ memset(dp,0,sizeof(dp)); for(int i = n-1;i >= 0;i--){ for(int j = 0;j <= W;j++){ if(j < w[i]) dp[i][j] = dp[i+1][j]; else{ dp[i][j] = max(dp[i+1][j],dp[i+1][j-w[i]]+v[i]); } } } return; } int main(){ scanf("%d %d",&n,&W); for(int i = 0;i < n;i++){ scanf("%d %d",&w[i],&v[i]); } solve(); cout<<dp[0][W]<<endl;; return 0; }
然后是逆向的 - -
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> using namespace std; int n,W; int dp[3500][3500]; int w[3500]; int v[3500]; void solve(){ memset(dp,0,sizeof(dp)); for(int i = 0;i < n;i++){ for(int j = 0;j <= W;j++){ if(j < w[i]) dp[i+1][j] = dp[i][j]; else dp[i+1][j] = max(dp[i][j],dp[i][j-w[i]]+v[i]); } } return; } int main(){ cin>>n>>W; for(int i = 0;i < n;i++){ scanf("%d %d",&w[i],&v[i]); } solve(); cout<<dp [W]<<endl;; return 0; }
推重量
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> using namespace std; int n,W; int dp[3500][3500]; int w[3500]; int v[3500]; void solve(){ memset(dp,0,sizeof(dp)); for(int i = 0;i < n;i++){ for(int j = 0;j <= W;j++){ dp[i+1][j] = max(dp[i+1][j],dp[i][j]); if(j + w[i] <= W) dp[i+1][j+w[i]] = max(dp[i+1][j+w[i]],dp[i][j]+v[i]); } } return; } int main(){ cin>>n>>W; for(int i = 0;i < n;i++){ scanf("%d %d",&w[i],&v[i]); } solve(); cout<<dp [W]; return 0; }
一维数组
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> using namespace std; int n,W; int dp[3500]; int w[3500]; int v[3500]; void solve(){ memset(dp,0,sizeof(dp)); for(int i = 0;i < n;i++){ for(int j = W;j >= w[i];j--){ dp[j] = max(dp[j],dp[j - w[i]] + v[i]); } } return; } int main(){ scanf("%d %d",&n,&W); for(int i = 0;i < n;i++){ scanf("%d %d",&w[i],&v[i]); } solve(); cout<<dp[W]<<endl;; return 0; }
$(".MathJax").remove();
相关文章推荐
- 这次一定要记住 多重背包
- asp 里面 sub 和function 的区别 已经很多次了 这次一定要记住
- asp 里面 sub 和function 的区别 已经很多次了 这次一定要记住
- REBUILD ALL!这回一定要记住
- 好东西,一定要记住
- HDU 1171 01-背包 空间优化 (这次贴代码,下次写题解)
- 一定要记住这20种PS技术!!!会让你的照片美的不行!!!
- 一定要记住的话
- HDU2186 悼念512汶川大地震遇难同胞——一定要记住我爱你【水题】
- 单种物品数量不一定为1的背包问题
- 软件测试员这些坑一定要记住了,不要再往里面掉了
- 面试题03 - 重建二叉树 【树】[ 一定要记住 ]
- 一定要记住的一些shell命令
- 这次一定抓住机会
- [转] 一定要记住这20种PS技术!!!会让你的照片美的不行!!!..
- 面试题03 - 重建二叉树 【树】[ 一定要记住 ]
- Codeforces Round #381 (Div. 2) 补一道很经典的一定要记住的题
- Hdu 2186 悼念512汶川大地震遇难同胞——一定要记住我爱你【基础】
- 开发语录——这次一定行