动态编程和0/1背包

时间:2014-04-28 08:10:33

标签: algorithm dynamic-programming knapsack-problem

我在理解动态编程方面遇到了一些麻烦,尽管我已经阅读了太多试图理解的资源。

我理解使用斐波纳契算法进行动态编程的示例。我理解如果你使用分而治之的方法,你最终会多次解决一些子问题,动态编程通过解决那些重叠的子问题而只需要解决一次(并将其存储起来以备将来使用)参考)。然而,我已经在课堂上使用0/1背包问题介绍了动态编程,我并不是真的理解这个例子,或者它是如何理解动态编程的,或者它是如何进行动态编程的。无论如何类似于斐波那契的例子。

以下是与之相关的幻灯片:

enter image description here

enter image description here

enter image description here

enter image description here

我主要了解在最后一张幻灯片之前发生了什么,其中f(i,y)= max {....}

我到底发现了什么?为什么我发现任何东西的最大值?最重要的是,这与动态编程有什么关系?我不理解这种关系,就像我在斐波那契例子中所做的那样。老实说,我不知道这个背包问题与动态编程有什么关系,因为它在使用斐波那契例子来说明动态编程方面似乎没有任何可比性。就像我没有看到任何相似之处或任何东西,它对我来说真的没有多大意义

2 个答案:

答案 0 :(得分:1)

我到底发现了什么?

f是您放入背包的所有物品带来的利润总和。在第一阶段,有两种可能性:

  • 你把物品放在背包里,你解决了所有剩余物品的问题,从你的最大重量减去物品i的重量,
  • 你没有将物品i放在背包里,你解决了所有剩余物品的问题。这是一个你已经解决的子问题,因为你正在向后工作,因此动态编程的链接应该在那里显而易见。

解决方案是带来最高利润的选项,因此最大化

答案 1 :(得分:1)

动态编程只是根据更简单的子问题来定义问题。

就Fibonacci而言,我们用两个较小的术语来定义问题。

在这种情况下,我们使用一些项目来定义问题,并根据包含较少项目和可能较小容量的问题来定义一些容量。


f(i,y)是包含in的项目的最大利润,其容量为y

现在我们可以将其定义为包含或排除项i,然后通过i+1获取商品n的最大利润。

当我们排除项目i时,这不会改变权重,因此我们可以只查看相同容量的最大利润,即f(i+1, y),而利润也不会#&# 39;改变。

当我们添加商品i时,这会改变权重,特别是商品i的权重w_i,因此我们必须查找f(i+1, y - w_i)。但是我们也从项目i获得利润,因此我们需要增加其利润,即p_i

现在,既然我们想要最大的利润,我们必须找到这两个值的最大值,给我们:

f(i, y) = max{f(i+1, j), f(i+1, y - w_i) + p_i}

如果你仍然无法理解它,我建议你自己构建一个可以解决的例子 - 没有多少解释看到它实际工作的相当措施,并使用它来获得我们为什么做的一些直觉事我们的方式。