Algorithm 为什么使用动态规划的0/1背包不是多项式时间算法

Algorithm 为什么使用动态规划的0/1背包不是多项式时间算法,algorithm,big-o,time-complexity,Algorithm,Big O,Time Complexity,我很难理解为什么使用动态规划的0/1背包不是多项式时间可解的。这里也有人问过类似的问题。有人给出了解释,但我仍然不明白为什么我们要考虑权重输入的二进制表示。那个么n呢,若用二进制表示,我能说它和项数成指数关系吗?类似地,对于任何其他多项式时间算法,我可以声称它们具有指数时间复杂度,因为在计算机中,每个输入都用二进制数字表示。我知道我错了。有人能用简单易懂的方式指出原因吗?提前感谢。一种非常简单的方法是,如果将限制加倍,则输入的大小只增加一位(因为限制是输入的一部分),而运行时间则增加一倍。这显然

我很难理解为什么使用动态规划的0/1背包不是多项式时间可解的。这里也有人问过类似的问题。有人给出了解释,但我仍然不明白为什么我们要考虑权重输入的二进制表示。那个么n呢,若用二进制表示,我能说它和项数成指数关系吗?类似地,对于任何其他多项式时间算法,我可以声称它们具有指数时间复杂度,因为在计算机中,每个输入都用二进制数字表示。我知道我错了。有人能用简单易懂的方式指出原因吗?提前感谢。

一种非常简单的方法是,如果将限制加倍,则输入的大小只增加一位(因为限制是输入的一部分),而运行时间则增加一倍。这显然是相对于输入大小的指数行为


然而,虽然项目数量翻倍也会使运行时间翻倍,但它也会使输入项目的大小翻倍,因此输入大小和运行时间之间的部分关系只是线性的。

鉴于背包问题与以下输入有关:n个项目值vi、n个权重wi和容量K值(由K位表示),我们有:
  • 以位为单位的输入大小为N=2n*64+k。 因此,背包DP解决方案的比特复杂度为O(N)=O(N*2k)(忽略常数因子64)

    上述计算中暗示了以下假设: 每个权重wi和每个值vi可以用一个最大大小为8字节或64位的字来表示

    进一步阐述:

  • 如果容量加倍(K'=2K或K'=K+1),输入仍然包含n个值vi、n个权重wi和容量值K'(由K+1位表示)。因此,以位表示的输入大小为N'=2n*64+k+1=N+1。综上所述,当k增加1=>O(N)是指数w.r.t.k和伪多项式w.r.t.k时,位运算的数量增加了一倍

  • 如果项目数量加倍(n'=2n),则输入现在包含2n个项目值vi、2n个权重wi和容量值K。因此,以位表示的输入大小为n'=2*2n*64+K。总之,当n加倍=>O(n)是多项式w.r.t.n时,位运算的数量加倍

    关于位复杂性和字复杂性的参考:

  • 书:算法分析的程序员助手——第2.2节,因为它不仅取决于对象的数量,而且还取决于极限值。这就是所谓的拟多项式算法。您可以找到详细的explanation@kids_fox这应该是一个答案。我想你会发现你的说法“对于任何其他多项式时间算法,我可以说它们具有指数时间复杂度”是错误的。如果你看到一个算法,其运行时间是多项式的,只有当输入以一元形式给出时,它才是一个伪多项式时间算法,没有可靠的来源会将其描述为多项式时间算法。输入的大小只增加一位(因为限制是输入的一部分。我不知道为什么输入的大小没有加倍。@爱德华:因为
    W
    是用二进制编码表示的。如果用一元编码表示,那就是多项式。