Python中的无界背包

时间:2015-04-18 21:25:28

标签: python knapsack-problem

考虑以下问题陈述:

给定n个整数的列表,w = {w1,w2,...,wn}和另一个整数,W代表预期的总和。从'w'中选择零个或多个数字,使这些数字的总和尽可能接近预期总和(W)但不超过预期总和(W)。

  • 可以多次选择“w”的每个元素。

see code:

def KnapSack (i, w, X, W):
    if ( w[i:] == [] and X >= 0):
        return  ( W - X )   
    elif ( X < 0 ):
        return 0        
    else:       
        return max (KnapSack(i+1, w, X, W), KnapSack(i+1, w, X-w[i], W))

n, W = raw_input().split()
n, W = [int(n), int(W)]
w = map(int, raw_input().split())
print KnapSack (0, w[0:], W, W)

n和W分别表示列表w和预期总和的长度。第二行由n个空格分隔的整数组成,w1,w2,...,wn,表示列表w的元素。

我真的遇到了无限制的条件,允许从'w'中进行多次选择。请帮忙!

1 个答案:

答案 0 :(得分:3)

如果可以多次选择每个元素,则不再是背包问题(即NP难),并且可以应用Bézout's identity,可以应用extended euclidean algorithm来解决。

或者您可以修复像

这样的事情
return max (KnapSack(i+1, w, X, W), KnapSack(i, w, X-w[i], W))