编辑:代码已修复。
我正在尝试使用动态编程来解决下面的问题,但它给出了15而不是18。我正在寻找一个小时的错误,但我无法理解。
问题: 有两个容量为c1,c2和n元素组的背包。每个元素都有一个w1(放入第一个背包时的重量),一个w2(放入第二个背包时的重量)和一个值。我需要找到适合相应背包的n元素集的两个不相交的子集 并且具有最大总价值。
w1:放入背包1时物品的重量
w2:放入背包2时物品的重量
v:value
答案:
背包1:第1项第2项
背包2:第3项第4项
算法:(python)
w1 = [2, 3, 2, 5]
w2 = [2, 5, 1, 5]
v = [4, 3, 5, 6]
c1 = 5
c2 = 6
n = 4
arr = [[[0 for x in range(c2 + 1)] for y in range(c1 + 1)] for z in range(n + 1)]
for i in range(1, n + 1):
for j in range(0, c1 + 1):
for k in range(0, c2 + 1):
weight1 = w1[i - 1]
weight2 = w2[i - 1]
val = v[i - 1]
if weight1 <= j and weight2 <= k: #item fits both knapsack
arr[i][j][k] = max(val + arr[i - 1][j - weight1][k], #put knapsack 1
val + arr[i - 1][j][k - weight2], #put knapsack 2
arr[i - 1][j][k])
elif weight1 <= j: #just knapsack 1
arr[i][j][k] = max(val + arr[i - 1][j - weight1][k], #take
arr[i - 1][j][k])
elif weight2 <= k: #just knapsack 2
arr[i][j][k] = max(val + arr[i - 1][j][k - weight2], #take
arr[i - 1][j][k])
else:
arr[i][j][k] = arr[i - 1][j][k]
print arr[n][c1][c2]
我试过这个算法,它有效。这是代码: Knapsack algorithm for two bags
w1 = [2, 3, 2, 5]
w2 = [2, 5, 1, 5]
v = [4, 3, 5, 6]
c1 = 5
c2 = 6
n = 4
result = -1
arr = [[0 for y in range(c2 + 1)] for z in range(c1 + 1)]
for i in range(1, n + 1):
weight1 = w1[i - 1]
weight2 = w2[i - 1]
val = v[i - 1]
for j in range(c1, -1, -1):
for k in range(c2, -1, -1):
if weight1 <= j and weight2 <= k: #item fits both knapsack
arr[j][k] = max(val + arr[j - weight1][k],
val + arr[j][k - weight2],
arr[j][k])
elif weight1 <= j: #just knapsack 1
arr[j][k] = max(val + arr[j - weight1][k],
arr[j][k])
elif weight2 <= k: #just knapsack 2
arr[j][k] = max(val + arr[j][k - weight2],
arr[j][k])
print arr[c1][c2]