01背包问题存在最优子结构的证明
2013-03-29 23:39
405 查看
表述:如果
是问题
的最优解,那么
(1) 对于任意
, 有
, 则有
是问题
的最优解;
(2) 对于任意
,有
,则有
是问题
的最优解。
虽然背包九讲中的子问题被表述成“将前i件物品放入容量为v的背包中“,但我认为这里 i 表示子问题的规模,表述为”将 i 个物品放入容量为v的背包中“也可以。这样,最优子结构似乎就是显然的了,因为如果子问题不是最优解,那么比如
是子问题的最优解,那么
的最优解将会是
。与假设相矛盾。
然而,如何理解由上述的最优子结构性质得到背包九讲中给出的状态转移方程呢?
关键是对于第 i 个的物品的取或者是不取情况的分类,v是还有剩i个物品供选择时的背包容量,取或者不取对应不同的子问题,而获得更大价值的子问题将会产生最优解,这就是由最优子结构推断出的。
更进一步,背包九讲给出的伪代码中,有两个循环,内循环是 v = V... 0 的,这样做是因为,当由子问题递归去求解时,子问题所对应的背包剩余容量是不确定的,比如对于 i = 1,即外层循环中考虑第一个物品时,如果 v = V时表明不管以何种顺序选择物品,当面临选择第 i 个物品时,背包的容量为V,即前面选择的物品都没有取;而如果 v = 0时面临选择第 i 个物品时,背包已经满了。伪代码中确定一个物品的顺序,我认为只是实现问题,因为背包最优解的产生应该是与选择物品的先后顺序无关的。
上面的思考是我在考虑背包九讲中为什么子问题结构表述时,要确定是”前 i 个……“时引起的困惑而触发的思考,不对的地方,欢迎大家批评指正。
是问题
的最优解,那么
(1) 对于任意
, 有
, 则有
是问题
的最优解;
(2) 对于任意
,有
,则有
是问题
的最优解。
虽然背包九讲中的子问题被表述成“将前i件物品放入容量为v的背包中“,但我认为这里 i 表示子问题的规模,表述为”将 i 个物品放入容量为v的背包中“也可以。这样,最优子结构似乎就是显然的了,因为如果子问题不是最优解,那么比如
是子问题的最优解,那么
的最优解将会是
。与假设相矛盾。
然而,如何理解由上述的最优子结构性质得到背包九讲中给出的状态转移方程呢?
关键是对于第 i 个的物品的取或者是不取情况的分类,v是还有剩i个物品供选择时的背包容量,取或者不取对应不同的子问题,而获得更大价值的子问题将会产生最优解,这就是由最优子结构推断出的。
更进一步,背包九讲给出的伪代码中,有两个循环,内循环是 v = V... 0 的,这样做是因为,当由子问题递归去求解时,子问题所对应的背包剩余容量是不确定的,比如对于 i = 1,即外层循环中考虑第一个物品时,如果 v = V时表明不管以何种顺序选择物品,当面临选择第 i 个物品时,背包的容量为V,即前面选择的物品都没有取;而如果 v = 0时面临选择第 i 个物品时,背包已经满了。伪代码中确定一个物品的顺序,我认为只是实现问题,因为背包最优解的产生应该是与选择物品的先后顺序无关的。
上面的思考是我在考虑背包九讲中为什么子问题结构表述时,要确定是”前 i 个……“时引起的困惑而触发的思考,不对的地方,欢迎大家批评指正。
相关文章推荐
- 证明01分数背包问题具有贪心选择性质
- hdu 2639 01 背包 存在k 个多解问题
- 数据结构经典算法学习之01背包问题
- 01背包问题
- 基础01背包问题
- 01背包问题
- 01背包问题和完全背包问题
- 动态规划经典:01背包问题
- 数据结构(C#)-- 贪心算法解决背包问题
- 01普通背包和01满背包问题
- 01背包问题(动态规划)
- 背包问题:01背包与完全背包
- 01背包问题中用二维数组的思考
- 01背包问题的分析与优化
- 背包问题教程-01背包,完全背包,多重背包,混合背包
- 01背包问题
- 关于LC(01)背包的一些小问题。
- 01背包问题详解
- [算法]数据结构算法背包问题解法之递归解法,C语言实现
- 01背包问题详解(转载)