📜  DAA-0-1背包

📅  最后修改于: 2021-01-12 03:34:56             🧑  作者: Mango


在本教程中,我们前面已经讨论了使用贪婪方法的分数阶背包问题。我们已经表明,贪婪方法为小背包带来了最佳解决方案。但是,本章将介绍0-1背包问题及其分析。

在0-1背包中,物品不能被破坏,这意味着小偷应该将物品作为一个整体或应该离开它。这就是将其称为0-1背包的原因。

因此,在0-1背包的情况下, x i的值可以为01 ,而其他约束保持不变。

0-1背包无法通过贪婪方法解决。贪婪的方法不能确保最佳解决方案。在许多情况下,贪婪方法可能会提供最佳解决方案。

以下示例将建立我们的声明。

示例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。

示例2

在此示例中,不是基于总体利益来选择项目,而是基于比率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的项目BC来实现此实例的最佳解决方案。

因此,可以得出结论,贪婪方法可能无法提供最佳解决方案。

为了解决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 = 1 ,v 2 ,…,v n >w = 1 ,w 2 ,…,w n >

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]进行跟踪。

分析

该算法需要θ( nw )次,因为表c具有( n + 1)。( w + 1)个条目,其中每个条目需要θ(1)时间来计算。