背包问题中的表格与动态编程之间有什么联系?

时间:2018-12-21 18:13:27

标签: algorithm dynamic-programming knapsack-problem

很抱歉,我无法从各种资源中找到答案。

在背包算法中,我们构造一个表格,例如在https://www.geeksforgeeks.org/0-1-knapsack-problem-dp-10/

我已经在克莱因伯格的书中读到了背包问题。根据我的理解,动态编程是将问题分解为重叠的子问题-但是,我已经在许多书籍/在线资源中看到了此表用于解决背包问题。我似乎无法将这张表与动态编程联系起来吗?我们要记住这张表中的任何内容吗?在我看来,这是解决背包的一个明智的解决方案,但不是动态编程的解决方案。我看过视频和文本,它们通过使用表或使用动态编程解决方案来解决问题,但是似乎没有人提供两者之间的链接。

1 个答案:

答案 0 :(得分:1)

它仍然是动态编程。唯一的区别是,动态编程算法在n中仍然不是多项式,而在nW中都是。对于这些类型的问题,您必须区分由于输入而自然产生的值和作为输入的一部分的值。

您输入的内容由n个不同的项目和数字W组成; W是显式的,并不暗示输入的大小。因为我们使用某种有效的编码(即二进制)来提供W,所以W的大小在W的编码中为指数。也就是说,输入包含代表W的O(lg W)位,但是我们构建的表有W行(或列,以加深您的查看方式)。这使得算法在输入大小上呈指数级。

但是,如果我们放宽通常必须有效地表示输入的规则,则可以使用“一元”表示法指定W;输入中的W为1,而不是二进制表示形式。现在您可以断言,因为输入大小是nW中的多项式,而不是像以前那样在nlg W中,所以DP表也是输入。

这大致是强和弱NP硬度之间的区别:如果问题是弱NP硬度,则如果我们指定一些数值的一元编码,则可以找到多项式时间算法(通常基于动态编程)参数,而不是通常的二进制编码。