0-1背包问题
来源:互联网 发布:网页美工有前景吗 编辑:程序博客网 时间:2024/06/03 17:33
给定容量为c的背包和n个物品,每个物品的重量为wi,每个物品的价值为vi。
应该如何选择装入背包的物品,让背包所能获得最大价值。
0-1背包问题的状态转移方程为f[i][j]=max{ f[i-1][j] , f[i-1][j-w[i]]+v[i]}
声明一个大小为f[n][c]的二维数组,f[i][j]表示在面对物品i时,前i-1件物品,在容量为j的背包里,所能获得的最大价值
二维数组的计算方法如下:
j < w[i] 表示背包容量装不下物品i,只能不拿,则f[i][j]=f[i-1][j]
j >= w[i] 表示背包容量可以放下第 i 件物品,我们就要考虑拿这件物品是否能获取更大的价值
如果取第i件物品,就要f[i][j]=f[i-1][j-w[i]]+v[i],表示装了第i件物品,背包的容量就要减少w[i],但是价值增加了v[i]
如果不取第i件物品,就要f[i][j]=f[i-1][j],表示不装第i件物品,背包的最大价值还是f[i-1][j]
取还是不取就要决定于max{ f[i-1][j] , f[i-1][j-w[i]]+v[i]}
如下四个物品,容量为8的背包
推算过程
代码实现
#include<iostream>#include<cstring> using namespace std;int main(){int v[5]={0,3,4,5,6};int w[5]={0,2,3,4,5};int c=8;int f[5][11];memset(f,0,sizeof(f));for(int i=1;i<=5;i++){for(int j=1;j<=c;j++){if(j<w[i]){f[i][j]=f[i-1][j];}else{f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+v[i]);}}}for(int i=1;i<=5;i++){for(int j=1;j<=c;j++){cout<<f[i][j]<<" ";}cout<<endl;}return 0;}
阅读全文
0 0
- 背包问题(0-1背包、完全背包、多重背包)详解
- 背包问题和0-1背包问题
- 背包问题和0-1背包问题
- 背包问题系列--"0-1背包问题"
- 背包笔记-含0/1背包问题、完全背包问题、多重背包问题、二维背包问题、分组背包问题
- 【背包问题】背包问题之0-1背包、完全背包、多重背包
- 0-1背包问题
- 0/1背包问题
- 0,1背包问题
- 0-1背包问题
- 0/1背包问题
- 0-1背包问题
- // 0-1背包问题
- 0/1背包问题
- 0-1背包问题
- 0-1背包问题
- 0-1背包问题
- 0/1背包问题
- springmvc源码分析----入门看springmvc的加载过程
- Java 里如何实现线程间通信?
- POJ 2983 浅谈差分约束系统处理严格等价性问题
- 10/11
- 如何在类里面引用另一个类的方法里的局部变量(重要)
- 0-1背包问题
- CPU-bound(计算密集型) 和I/O bound(I/O密集型)
- JNI/NDK基础开发
- opencv 05 Haar 面部特征处理(facial_features) vs2015
- devstack部署openstack流程与相关问题的记录(ubuntu 16.04)
- 算术移位和逻辑移位
- Ambari Kerberos常用命令
- HDU 1520 Anniversary party 树形dp
- 错排