【问题标题】:Knapsack algorithm, weird behavior (python3)背包算法,奇怪的行为(python3)
【发布时间】:2018-12-11 13:38:26
【问题描述】:

我一直在研究递归并试图解决背包问题 [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 &lt; 0 并调用print(KP(25,cost_array,value_array)) 时,我得到的结果是33 - q33 是背包可以拥有的最大值。

这里的奇怪之处在于,如果我使用 Weight &gt; 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

【问题讨论】:

  • 实际上,当您为q 分配一个负值时,您得到的是33+q 而不是33-q

标签: python-3.x algorithm knapsack-problem


【解决方案1】:

假设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))

【讨论】:

    猜你喜欢
    • 2021-11-08
    • 2016-01-14
    • 2020-03-24
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多