Algorithm 为什么背包问题不能用动态规划算法在多项式时间内求解?

Algorithm 为什么背包问题不能用动态规划算法在多项式时间内求解?,algorithm,complexity-theory,knapsack-problem,Algorithm,Complexity Theory,Knapsack Problem,我看到了这个解释,但还是不能完全理解。 如果我们遵循以下逻辑:假设某个算法在O(n)时间内工作,那么: 让我们假设二进制项中的n=1000(4位长) 所以时间复杂度T(n)=O(8) 让我们把输入的大小增加一倍n=10000000(8位长)T(n)=O(128) 时间以指数形式增加,所以这意味着O(n)不是多项式时间 问题是:“多项式作为什么的函数?”。当我们确定算法的复杂性时,我们通常(但并非总是)将其表示为输入长度的函数。通常,但并非总是,此长度由字母n表示。例如,如果研究涉及图形的问题,字

我看到了这个解释,但还是不能完全理解。 如果我们遵循以下逻辑:假设某个算法在O(n)时间内工作,那么: 让我们假设二进制项中的n=1000(4位长) 所以时间复杂度
T(n)=O(8)
让我们把输入的大小增加一倍<代码>n=10000000(8位长)T(n)=O(128) 时间以指数形式增加,所以这意味着
O(n)
不是多项式时间

问题是:“多项式作为什么的函数?”。当我们确定算法的复杂性时,我们通常(但并非总是)将其表示为输入长度的函数。通常,但并非总是,此长度由字母
n
表示。例如,如果研究涉及图形的问题,字母
n
通常用于表示图形中的顶点数量,而不是表示输入的长度

在您的情况下,变量
n
是物品的数量,变量
W
是行李的容量

因此,数字
n
与复杂性相关;但它本身并不是输入的整个长度。让我们调用
N
输入的实际长度。尽量不要混淆
n
n
。算法的复杂度必须表示为
N
的函数,“线性复杂度”、“多项式复杂度”、“指数复杂度”等术语总是指
N
,而不是
N

输入的长度是多少

您的输入包括成对的
(重量(i)、值(i))
,然后是容量
W
。据推测,袋子中的每件物品的重量范围为
0
W
;以及一个从
0
到某个最大值
V
的值。因此,权重需要与
W
一样多的位来表示,值需要与
V
一样多的位来表示

如果你对对数和写数字有点了解,你应该知道写一个数字所需的位数与其对数成正比。因此,每个权重需要
log(W)
位,每个值需要
log(V)

因此:
N=N*(log(W)+log(V))

你可以说服自己,
W
V
的长度与复杂性有关。这里我们所有的数字都是整数。但想象一下现实世界的问题。重量可以用吨或克表示
1吨
1000000克
相同。价值可以用美分或数万欧元表示。在将现实问题输入算法之前,我们需要选择我们的单位

如果重量以克而不是吨表示,您的算法解决问题是否需要更长的时间

答案是肯定的。因为克比吨精确一百万倍。所以当你用克而不是吨来提问时,你要求的答案要精确一百万倍。因此,该算法将需要更多的时间来找到该解决方案

我希望我能说服您,算法的复杂性应该表示为输入的实际长度的函数,而不仅仅是元素的数量。

问题是:“多项式作为什么的函数?”。当我们确定算法的复杂性时,我们通常(但并非总是)将其表示为输入长度的函数。通常,但并非总是,此长度由字母
n
表示。例如,如果研究涉及图形的问题,字母
n
通常用于表示图形中的顶点数量,而不是表示输入的长度

在您的情况下,变量
n
是物品的数量,变量
W
是行李的容量

因此,数字
n
与复杂性相关;但它本身并不是输入的整个长度。让我们调用
N
输入的实际长度。尽量不要混淆
n
n
。算法的复杂度必须表示为
N
的函数,“线性复杂度”、“多项式复杂度”、“指数复杂度”等术语总是指
N
,而不是
N

输入的长度是多少

您的输入包括成对的
(重量(i)、值(i))
,然后是容量
W
。据推测,袋子中的每件物品的重量范围为
0
W
;以及一个从
0
到某个最大值
V
的值。因此,权重需要与
W
一样多的位来表示,值需要与
V
一样多的位来表示

如果你对对数和写数字有点了解,你应该知道写一个数字所需的位数与其对数成正比。因此,每个权重需要
log(W)
位,每个值需要
log(V)

因此:
N=N*(log(W)+log(V))

你可以说服自己,
W
V
的长度与复杂性有关。这里我们所有的数字都是整数。但想象一下现实世界的问题。重量可以用吨或克表示
1吨
1000000克
相同。价值可以用美分或数万欧元表示。在将现实问题输入算法之前,我们需要选择我们的单位

如果重量以克而不是吨表示,您的算法解决问题是否需要更长的时间

答案是肯定的。因为