01背包问题存在最优子结构的证明

表述:如果  是问题  的最优解,那么

(1) 对于任意   , 有 , 则有  是问题 的最优解;

(2) 对于任意  ,有 ,则有   是问题的最优解。


虽然背包九讲中的子问题被表述成“将前i件物品放入容量为v的背包中“,但我认为这里 i 表示子问题的规模,表述为”将 i 个物品放入容量为v的背包中“也可以。这样,最优子结构似乎就是显然的了,因为如果子问题不是最优解,那么比如  是子问题的最优解,那么  的最优解将会是  。与假设相矛盾。

然而,如何理解由上述的最优子结构性质得到背包九讲中给出的状态转移方程呢?

  

关键是对于第 i 个的物品的取或者是不取情况的分类,v是还有剩i个物品供选择时的背包容量,取或者不取对应不同的子问题,而获得更大价值的子问题将会产生最优解,这就是由最优子结构推断出的。

更进一步,背包九讲给出的伪代码中,有两个循环,内循环是 v = V... 0 的,这样做是因为,当由子问题递归去求解时,子问题所对应的背包剩余容量是不确定的,比如对于 i = 1,即外层循环中考虑第一个物品时,如果 v = V时表明不管以何种顺序选择物品,当面临选择第 i 个物品时,背包的容量为V,即前面选择的物品都没有取;而如果 v = 0时面临选择第 i 个物品时,背包已经满了。伪代码中确定一个物品的顺序,我认为只是实现问题,因为背包最优解的产生应该是与选择物品的先后顺序无关的。


上面的思考是我在考虑背包九讲中为什么子问题结构表述时,要确定是”前 i 个……“时引起的困惑而触发的思考,不对的地方,欢迎大家批评指正。

你可能感兴趣的:(algorithm)