动态规划---->0/1背包问题
2016-11-09 00:00
260 查看
0/1背包问题
有N件物品和一个容量为V的背包。第i件物品的重量是c[i],价值是w[i]。物品或者整件装入背包中, 或者根本不装入(即不能装入物品的一部分),求解将哪些物品装入背包可使价值总和最大。最优性原理对0/1背包问题成立
算法基本思想
利用动态规划思想 ,子问题为:f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。其状态转移方程是:f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}
解释一下上面的方程:“将前i件物品放入容量为v的背包中”这个子问题,如果只考虑第i件物品放或者不放,那么就可以转化为只涉及前i-1件物品的问题,即
1、如果不放第i件物品,则问题转化为“前i-1件物品放入容量为v的背包中”;
2、如果放第i件物品,则问题转化为“前i-1件物品放入剩下的容量为v-c[i]的背包中”(此时能获得的最大价值就是f [i-1][v-c[i]]再加上通过放入第i件物品获得的价值w[i])。
f[i][v]的值就是1、2中最大的那个值。
(注意:f[i][v]有意义当且仅当存在一个前i件物品的子集,其容量总和为v。所以按照这个方程递推完毕后,最终的答案并不一定是f
[V],而是f
[0..V]的最大值。)
例子1:
![](https://static.oschina.net/uploads/img/201611/09200551_cQHL.jpg)
C[v]从物品i=1开始,循环到物品3,期间,每次逆序得到容量v在前i件物品时可以得到的最大值。
例子2:
<---------------------------------------------------------------
![](https://static.oschina.net/uploads/img/201611/09200551_FNlB.jpg)
fori=1..N forv=V..0 f[v]=max{f[v],f[v-c[i]]+w[i]}; |
相关文章推荐
- 动态规划---->0/1背包问题
- 动态规划 (Dynamic Programming) 之 背包问题合辑 (Knapsack, Subset Sum, Partition and change making problem )
- 01背包问题 动态规划解法
- 动态规划解0-1背包问题
- poj1014 Dividing 动态规划 多重背包问题
- 动态规划求解0/1背包问题
- 动态规划 (Dynamic Programming) 之 背包问题合辑 (Knapsack, Subset Sum, Partition and change making problem )
- 0-1背包问题与完全背包问题C++实现 动态规划
- 0-1背包问题--动态规划解法
- 动态规划背包问题自己的理解:
- 用动态规划求如下解0/1 背包问题 (第八题)
- 动态规划 ------0-1背包问题
- 0-1背包问题的两种解法(回溯法和动态规划)
- 动态规划(背包问题)
- [动态规划]背包问题(找零/子集和/编辑距离)
- 0-1背包问题及其动态规划求解之二——王晓东的书本解法
- 0-1背包问题(动态规划) 解题报告
- 动态规划解决0-1背包问题
- 0-1背包问题入门小结 动态规划(DP)经典题目 POJ324 POJ1276
- hdoj 1248(背包问题)(动态规划)