背包问题-尽管有动态编程解决方案,但NP完整吗?


50

背包问题可以通过动态编程轻松解决。动态编程以多项式时间运行;这就是为什么我们这样做,对吗?

我已经读过它实际上是一个NP完全问题,这意味着解决多项式问题可能是不可能的。

我的错误在哪里?


5
请记住,DP是“表大小”的多项式。对于背包来说,该表成倍地大(请参阅凯夫的回答)。
拉斐尔

Answers:


40

当数字以二进制数给出时,背包问题NP-complete。在这种情况下,动态编程将以指数级的步数(输入的大小,即输入中的位数)完成

另一方面,如果输入中的数字以一元给出,则动态编程将在多项式时间内(以输入的大小)工作。

这种问题称为NP-complete

:另一个了解用于提供输入的编码的重要性的很好示例是考虑常用算法,以查看从2的数字是否为质数n并检查它们是否除以n。这是n多项式,但不一定是输入大小。如果n以二进制形式给出,则输入的大小为lgn,并且算法在时间O(n)=O(2lgn/2),它在输入大小上呈指数关系。问题的通常计算复杂度取决于输入的大小。

这种算法,即作为输入一部分的最大数量的多项式,但输入长度呈指数形式的算法称为伪多项式


但是请考虑要放入背包中的物品。需要输入对象,并且这样的输入必须是对象数量的多项式。如果对象足够多,则输入是具有问题大小的多项式。那么为什么我不能说背包问题是表大小上的P问题呢?我错了吗?
Strin '04

@Strin,不,少量的物体足以感觉到大背包,例如,如果背包的大小为,那么一个物体的大小为m就足够了。输入的大小约为2 lg m,比m小得多。(我假设我们正在谈论的是0-1背包。)mm2lgmm
Kaveh

您可以将输入分解为较小的输入,这些输入的二进制编码的大小可以在多项式时间内完成算法,然后组合解决方案吗?
Char

@Kaveh“输入的大小大约是2 lg m”,我不知道从哪里得到那部分。m(包装大小)与n(物品数量)之间的关系是完全未知的,对吗?并重新“当数字以二进制数形式给出时” ...但是您不能一味地说出来吗?对于大多数算法,我们以10为基础讨论输入大小。为什么在这里谈论二进制?以及是否以二进制,八进制,十进制等进行编码... actual遍历主算法循环的次数直接取决于nW
The111 2013年

1
@ The111,我认为最好将其发布为新问题,然后我将发布答案。我认为您的问题更为根本,并且有些评论与该问题并不十分相关。
卡夫

33

主要的混淆在于“ 大小 ”和“ ” 之间的差异。

多项式时间 ”表示多项式与输入大小有关。

Pseudopolynomial Time ”隐含输入的多项式。可以显示(下),这等效于输入大小的指数。


换句话说:让代表输入和的大小Ñ v 一个表示输入的值。NsizeNval

多项式时间: X ÑO(Nsizex)xN

伪垄断。时间: X ÑO(Nvalx)xN

现在,背包问题有了一个多项式解决方案而不是多项式解决方案,因为动态编程解决方案给出的运行时间取决于一个,即,其中W是代表最大容量的O(nW)W

Nsize=Logb(Nval)NvalbNval

Nval=bNsize

Nsize

O(bxNsize)b,xN


7
在这里创建一个帐户只是为了表示感谢!仅在您的示例之后,我才终于理解它。
Inoryy 2014年

2
您的回答打败了所有人,真棒!
穆罕默德·拉齐布

1
要添加到这个伟大的答案,我们可以说,如果我们改变从100到101在W的大小的问题没有增加,如果我们增加另一个位至W这使得它的两倍大尺寸增大,所以表会行数是原来的两倍,因此,随着行数增加一倍,问题时间就会加倍,这就是为什么它呈指数级的原因。
阿们

@bcorso假设您给定值N。并且必须找到1到N的数字总和,并且使用了for循环方法,那将是伪多项式Time算法?
DollarAkshay

8

P=NP

有,但是,不同的变体(例如,0-1背包其他人),可能会或可能不会有多项式时间内解决方案还是不错的近似。但这与一般的背包问题不同。同样,可能存在适用于特定(家族)实例的高效算法,但是在其他实例上这些算法将花费更长的时间。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.