考虑以下问题陈述:
给定n个整数的列表,w = {w1,w2,...,wn}和另一个整数,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'中进行多次选择。请帮忙!
答案 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))