ACM_程序设计竞赛:DP:01背包
2016-05-05 14:35
351 查看
01背包
设 n个重量和价值为wiw_i和viv_i的物品,从中选择总重量不超过W的物品,求挑选方案中价值总和最大
输入:
n=4
(w, v) = {(2,3),(1,2),(3,4),(2,2)}
w=5
输出
7(选择0,1,3)
记忆数组的写法
复杂度:O(nW)
递归式(DP)
DP的变形
设 n个重量和价值为wiw_i和viv_i的物品,从中选择总重量不超过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的变形
这里写代码片
相关文章推荐
- java jar 配置文件的相对路径问题
- oracle rownum原理和使用
- Linux主机被入侵后的处理案例
- 使用Maven编译项目遇到——“maven编码gbk的不可映射字符”解决办法
- nyoj 251 有趣的竞选(STL vector容器)
- angularjs中循环定时器的三种方法
- 汇编问题汇总
- ImageMagick漏洞演示
- 基调(听云)app,服务器,质量测试手段
- MAC 如何使用Github Desktop 客户端
- Maven学习总结(九)——使用Nexus搭建Maven私服
- js读取json文件数据
- 觉醒
- Python处理Excel(三):内置数据类型处理Excel数据
- ORA-01084: OCI 调用中的参数无效
- Oracel数据库中视图与同义词的理解及应用场景
- UINavigationController先pop再push
- FPGA实现cordic算法
- 第一个简单的实例
- [原]sublime Text2