0-1背包问题
背包问题的产生:鱼与熊掌不可兼得的问题。比如一个软件的功能丰富了,但同样其运行时占用资源和静态软件包的体量也上去了。如何做到有限的资源,价值最大化。
0-1背包问题:对于一堆价值为,重量为
的物品 :
,和一个总承重
的背包。如何取舍使得背包总价值最大化。每个物品要么加一件要么不加。
解决方案1:计算性价比 ,按排序放入。
缺点:举反例,有一堆按性价比排序后的物品: ,背包承重
。给出的答案是物品1。但是物品2加上物品3的价值是最大的,所以上述方案不满足要求。但注意到,如果背包承重
,那么给出的答案就是对的。
解决方案2:考虑分解问题,注意到当物品数量很少,或者背包承重很小时,很容易得出最优解(只能放的下特定物品)。这个思路中有两个变量很小,物品数量 ,承重
。因此我们假设对于前
个物品,和一个总承重
的背包,最优解是
。那么对于前
个物品,和一个总承重
的背包,有以下两个情况:
- 最优解中不包含这个物品:等于背包
承重不变 ,只有前
个物品的最优解
。
- 最优解中包含这个物品:等于对于前
个物品,承重至多为
的包的价值最优解
,以此为基础,又放入了这个物品,得到
(因为前者如果不是最优,我可以找到一个比前者更优的解作为 B[i][w-w_{i}],然后加入这个物品,得到更优的解,与情况描述矛盾)。
比较两者优劣后,即可得最优解等式: 。
完全背包问题
完全背包问题的产生:可以认为是数学上对 0-1 问题的拓展。
完全背包问题:物品数量无限,可以不加,也可以加 次。
解决方案:思路和 0-1 背包问题是一样的,对于前 个物品,和一个总承重
的背包,有以下
种情况:
- 最优解中不包含这个物品:等于背包
承重不变 ,只有前
个物品的最优解。
- 最优解中包含 1 个物品:等于对于前
个物品,承重至多为
的包的价值最优解,加入了 1 个该物品(因为前者如果不是最优,我可以找到一个比前者更优的解,然后加入这个物品,得到更优的解,矛盾)。
- 最优解中包含 2 个物品:等于对于前
个物品,承重至多为
的包的价值最优解,加入了 2 个该物品(因为前者如果不是最优,我可以找到一个比前者更优的解,然后加入这个物品,得到更优的解,矛盾)。
- 最优解中包含 3 个物品:等于对于前
个物品,承重至多为
的包的价值最优解,加入了3 个该物品(因为前者如果不是最优,我可以找到一个比前者更优的解,然后加入这个物品,得到更优的解,矛盾)。
- 。。。。
- 最优解中包含 k 个物品:等于对于前
个物品,承重至多为
的包的价值最优解,加入了 k 个该物品(因为前者如果不是最优,我可以找到一个比前者更优的解,然后加入这个物品,得到更优的解,矛盾)。
此时, 满足方程组
。可得递推最优解:
。