【发布时间】:2021-04-22 22:49:41
【问题描述】:
我遇到了一些经典的背包解决方案,它们总是构建一个二维 DP 数组。 在我看来,我下面的代码解决了经典的背包问题,但只有一个 1-dim DP 数组。 谁能告诉我我的解决方案在哪里不起作用,或者为什么它与 2D-DP 版本相比计算效率低?
可以在此处找到 2D-DP 版本 https://www.geeksforgeeks.org/python-program-for-dynamic-programming-set-10-0-1-knapsack-problem/
示例输入:
weights = [(3,30),(2,20),(1,50),(4,30)]
constraint = 5
我的解决方案:
def knapsack(weights,constraint):
n = len(weights)
#define dp array
dp = [0]*(constraint+1)
#start filling in the array
for k in weights:
for i in range(constraint,k[0]-1,-1):
dp[i] = max(dp[i],dp[i-k[0]]+k[1])
return dp[constraint]
【问题讨论】:
-
好吧,您的
weights输入是一个二维数组。您是否有指向您不喜欢的对比解决方案的链接? -
您是否有代码无法运行的测试用例?
-
嗨蒂姆 - 感谢您的回答,这是有道理的,但在这样的二维数组中转换输入数据会不会计算效率低下? [链接] (geeksforgeeks.org/…)
-
@TimRoberts OP 正在讨论数组
dp。通常它是用一个二维数组来实现的,其中每一行都是从前一行填充的,答案在最后一行的末尾。 OP 正在覆盖同一行以节省内存。 -
@SufianLatif 感谢您的澄清,我在原始问题中添加了更多文本。我只是想知道为什么大多数提议的解决方案都使用 2D-DP,如果使用 1D-DP 也同样有效并且可以节省内存。
标签: python dynamic-programming knapsack-problem