📅  最后修改于: 2021-01-12 03:34:56             🧑  作者: Mango
在本教程中,我们前面已经讨论了使用贪婪方法的分数阶背包问题。我们已经表明,贪婪方法为小背包带来了最佳解决方案。但是,本章将介绍0-1背包问题及其分析。
在0-1背包中,物品不能被破坏,这意味着小偷应该将物品作为一个整体或应该离开它。这就是将其称为0-1背包的原因。
因此,在0-1背包的情况下, x i的值可以为0或1 ,而其他约束保持不变。
0-1背包无法通过贪婪方法解决。贪婪的方法不能确保最佳解决方案。在许多情况下,贪婪方法可能会提供最佳解决方案。
以下示例将建立我们的声明。
让我们考虑背包的容量为W = 25,并且各项如下表所示。
Item | A | B | C | D |
---|---|---|---|---|
Profit | 24 | 18 | 18 | 10 |
Weight | 24 | 10 | 10 | 7 |
在不考虑每单位重量的利润(P I / W I),如果我们应用贪婪的方法来解决这个问题,第一项A会被选为这将有助于所有元素中最高我妈妈的利润。
选择项目A后,将不再选择其他项目。因此,对于该给定的一组项目,总利润为24 。而通过选择项目B和C可以获得最佳解决方案,其中总利润为18 + 18 = 36。
在此示例中,不是基于总体利益来选择项目,而是基于比率p i / wi来选择项目。让我们考虑背包的容量为W = 60,并且各项如下表所示。
Item | A | B | C |
---|---|---|---|
Price | 100 | 280 | 120 |
Weight | 10 | 40 | 20 |
Ratio | 10 | 7 | 6 |
使用贪婪方法,选择第一项A。然后,选择下一个项目B。因此,总利润为100 + 280 = 380 。但是,可以通过选择总利润为280 + 120 = 400的项目B和C来实现此实例的最佳解决方案。
因此,可以得出结论,贪婪方法可能无法提供最佳解决方案。
为了解决0-1背包问题,需要动态编程方法。
一个小偷被抢劫一家商店,可携带W的最大I发作重量为他的背包。有n个项目,第i个项目的权重是w i ,选择该项目的利润是p i 。小偷应该带些什么?
令我成为W美元的最优解S中编号最高的项目。那么S ‘ = S-{i}是W-w i美元的最优解,解S的值为V i加上子问题的值。
我们可以用以下公式表达这一事实:将c [i,w]定义为项目1,2,…,i和最大i权重w的解。
该算法采用以下输入
马克斯我妈妈权重W
项目数n
两个序列v =
Dynamic-0-1-knapsack (v, w, n, W)
for w = 0 to W do
c[0, w] = 0
for i = 1 to n do
c[i, 0] = 0
for w = 1 to W do
if wi ≤ w then
if vi + c[i-1, w-wi] then
c[i, w] = vi + c[i-1, w-wi]
else c[i, w] = c[i-1, w]
else
c[i, w] = c[i-1, w]
可以从表中推导出要采取的项目集,从c [n,w]开始并向后追溯最佳值的来源。
如果c [i,w] = c [i-1,w] ,则项目i不属于解决方案,我们将继续使用c [i-1,w]进行跟踪。否则,项目i是解决方案的一部分,我们将继续使用c [i-1,wW]进行跟踪。
该算法需要θ( n , w )次,因为表c具有( n + 1)。( w + 1)个条目,其中每个条目需要θ(1)时间来计算。