ACM_程序设计竞赛:DP:01背包
来源:互联网 发布:美国富豪裸捐 知乎 编辑:程序博客网 时间:2024/05/17 07:07
- 01背包
设 n个重量和价值为wi 和vi 的物品,从中选择总重量不超过W的物品,求挑选方案中价值总和最大
输入:
n=4
(w, v) = {(2,3),(1,2),(3,4),(2,2)}
w=5
输出
7(选择0,1,3)
//暴力算法 //O(2^n)#include<iostream>using namespace std;const int maxn=100;int w[maxn],v[maxn];int n,W;int rec(int i,int j) //从第i个商品开始挑选总重量小于j的部分{ int res; if(i==n) //没有剩余物品 res=0; else if (j<w[i]) //无法挑选物品 res=rec(i+1,j); else //挑选和不挑选都尝试一下 res = max(rec(i+1,j),rec(i+1,j-w[i])+v[i]); return res;}void solve(){ printf("%d\n",rec(0,W));}int main(){ cin>>n; cout<<"输入w[]: "; for(int i=0;i<n;i++) { cin>>w[i]; } cout<<"输入v[]:"; for(int i=0;i<n;i++) { cin>>v[i]; } cout<<"输入W: "; cin>>W; solve(); return 0;}
- 记忆数组的写法
复杂度:O(nW)
#include<iostream>#include<string>using namespace std;const int maxn=100;int w[maxn],v[maxn];int n,W;int dp[maxn+1][maxn+1]; //记忆数组int rec(int i,int j) //从第i个商品开始挑选总重量小于j的部分{ if(dp[i][j]>=0) //如果已经计算过,直接返回 return dp[i][j]; int res; if(i==n) res=0; else if(j<w[i]) res=rec(i+1,j); else res=max(rec(i+1,j),rec(i+1,j-w[i])+v[i]); return dp[i][j]=res;}void solve(){ memset(dp,-1,sizeof(dp)); printf("%d\n",rec(0,W));}int main(){ cin>>n; cout<<"输入w[]: "; for(int i=0;i<n;i++) { cin>>w[i]; } cout<<"输入v[]:"; for(int i=0;i<n;i++) { cin>>v[i]; } cout<<"输入W: "; cin>>W; solve(); return 0;}
- 递归式(DP)
#include<iostream>#include<string>using namespace std;const int maxn=100;int w[maxn],v[maxn];int n,W;int dp[maxn+1][maxn+1]; //记忆数组void solve(){ 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]); } } printf("%d\n",dp[0][W]);}int main(){ cin>>n; cout<<"输入w[]: "; for(int i=0;i<n;i++) { cin>>w[i]; } cout<<"输入v[]:"; for(int i=0;i<n;i++) { cin>>v[i]; } cout<<"输入W: "; cin>>W; solve(); return 0;}
- DP的变形
这里写代码片
0 0
- ACM_程序设计竞赛:DP:01背包
- ACM_程序设计竞赛:贪心算法:硬币问题
- ACM_程序设计竞赛:贪心算法:区间问题
- ACM_程序设计竞赛:贪心算法:saruman army
- FOJ 2214 Knapsack problem 第六届福建省大学生程序设计竞赛 C 01背包DP变种
- 挑战程序设计竞赛 01背包变换对象
- ACM_总论_国际大学生程序设计竞赛考点
- ACM_程序设计竞赛:穷举法:DFS(深度优先)
- ACM_程序设计竞赛:穷举法:BFS(广度优先)
- ACM_程序设计竞赛:贪心算法:字典最小序
- [练习]背包DP 竞赛得分
- POJ 1742-Coins [dp 多重背包问题] 《挑战程序设计竞赛》2.3
- 【哈尔滨理工大学第七届程序设计竞赛决赛】 C 小明打联盟【DP +背包】
- 大背包问题(挑战程序设计竞赛)
- 《挑战程序设计竞赛》 超大背包问题实现
- ssl1377-竞赛真理【dp之分组背包】
- ACM_状压DP
- ACM_普通DP
- 用栈实现二叉树 C&java
- c++不常用功能之——运算符重载
- JavaScript学习总结(十七)——Javascript原型链的原理
- dedecms织梦做中英文(多语言)网站详解
- android:layout_width=“0dp”有什么用?为什么这么设置?
- ACM_程序设计竞赛:DP:01背包
- POI解析03版07版Word
- 转战自己的博客
- cf448C. Painting Fence【dfs】
- Spring mvc,uploadifive 文件上传实践(转自:https://segmentfault.com/a/1190000004503262)
- Android studio 导入fresco报错can not resolve 'com.facebook.fresco:fresco'的解决思想
- Jquery日历插件介绍及使用
- ffmpeg 视频转ts切片并生成m3u8播放列表文件
- window批处理bat命令详解