【问题标题】:Why dynamic programming for 0/1 Knapsack?为什么要对 0/1 背包进行动态规划?
【发布时间】:2018-04-22 03:50:31
【问题描述】:

我查看了很多资源以及this 的问题,但仍然很困惑为什么我们需要动态编程来解决 0/1 背包问题?

问题是:我有N 项目,每个项目的价值Vi,每个项目的重量Wi。我们有一袋总重量W。如何选择物品以获得超出重量限制的最佳总价值。

我对动态编程方法感到困惑:为什么不只计算每个项目的(价值/重量)的分数,然后选择重量比袋子中剩余重量更小的分数最好的项目?

【问题讨论】:

    标签: algorithm dynamic-programming


    【解决方案1】:

    当存在单位比率情况时,贪心算法会失败。例如考虑以下示例:

    n= 1 2, P= 4 18, W= 2 18, P/W= 2 1

    背包容量=18

    根据贪心算法,它会考虑第一个项目,因为它的 P/W 比更大,因此总利润将为 4(因为它不能在第一个之后插入第二个项目,因为在插入第一个项目后容量减少到 16 )。

    但实际答案是 18。

    因此,贪婪无法给出最优解的极端情况有很多,这就是我们在 0/1 背包问题中使用动态规划的原因。

    【讨论】:

      【解决方案2】:

      正如其他答案所指出的,您的方法存在极端情况。

      为了更好地解释递归解决方案,也许为了更好地理解它,我建议你用这个推理来处理它:

      对于每个“subsack”

      1. 如果我们没有合适的元素,就没有最佳元素
      2. 如果我们只有一个拟合元素,最好的选择就是那个元素
      3. 如果我们有多个拟合元素,我们会获取每个元素并计算其“subsack”的最佳拟合。最佳选择是价值最高的元素/子袋组合。

      此算法之所以有效,是因为它跨越了所有可能的拟合元素组合,并找到具有最高值的那个。

      作为the problem is NP-hard,直接解决方案是不可能的。

      【讨论】:

        【解决方案3】:

        看看这个反例:

        Weight 7, W/V pairs (3/10),(4/12),(5/21)
        

        【讨论】:

          【解决方案4】:

          对于基于分数的方法,您可以轻松找到反例。

          考虑

          W=[3, 3, 5]
          V=[4, 4, 7]
          Wmax=6
          

          您的方法给出了最佳值 Vopt=7(我们将采用自 7/5 > 4/3 以来的最后一项),但采用前两项会得到 Vopt=8

          【讨论】:

          • 哦!太感谢了,一直纠结到现在。但是我看到了这个例子,是的,动态编程更好,并给出了最佳解决方案..嗯..谢谢:)
          猜你喜欢
          • 1970-01-01
          • 2018-03-27
          • 1970-01-01
          • 2022-01-13
          • 1970-01-01
          • 2012-03-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多