我一直在从事递归工作,并试图解决背包问题[https://en.wikipedia.org/wiki/Knapsack_problem]。我想出了下面的算法,它很好用:
cost_array = [2,3,4,5,9]
value_array = [3,4,8,8,10]
def KP(Weight, C, V):
if Weight < 2:
return 0
q = 0
for i in range(len(C)):
q = max(q, (KP(Weight-C[i], [x for j,x in enumerate(C) if j!=i], \
[x for j,x in enumerate(V) if j!=i]) + V[i]*(Weight-C[i] >= 0)))
return q
print(KP(25,cost_array,value_array))
但是,当我将q
的值更改为q < 0
并调用print(KP(25,cost_array,value_array))
时,我得到的结果是33 - q
。将33
作为背包的最大值。
奇怪的是,只有在我使用Weight > 23
和此处23=2+3+4+5+9
来调用初始函数的情况下,我才会得到这种行为。
我不知道在什么时候将负q
添加到我的结果中,这条线永远不会执行这样的操作,你们能启发我吗?
q = max(q, (KP(W-C[i], [x for j,x in enumerate(C) if j!=i], [x for j,x in enumerate(V) if j!=i]) + V[i]*(W-C[i] >= 0)))
谢谢
d_darric
答案 0 :(得分:0)
假设q=-2
(负值)
因此,您用-2
填充了基本案例。也就是说,对于函数的基本情况,返回-2
,然后在递归的每个步骤中将其添加到答案中。尝试使用2D阵列的自底向上方法。您可以在https://www.youtube.com/watch?v=8LusJS5-AGo处查看。在您的情况下,您要用-2填充矩阵基本情况。
def knapSack(W, wt, val, n):
K = [[0 for x in range(W+1)] for x in range(n+1)]
q=-2 #Make it zero for correct answer
# Build table K[][] in bottom up manner
for i in range(n+1):
for w in range(W+1):
if i==0 or w==0:
K[i][w] = q #Here you are assigning negative value
elif wt[i-1] <= w:
K[i][w] = max(val[i-1] + K[i-1][w-wt[i-1]], K[i-1][w])
else:
K[i][w] = K[i-1][w]
return K[n][W]
# Driver program to test above function
value_array = [3,4,8,8,10]
cost_array = [2,3,4,5,9]
Weight = 25
n = len(val)
print(knapSack(Weight, cost_array, value_array, n))