两个背包,动态编程

时间:2017-10-08 20:06:43

标签: algorithm dynamic-programming knapsack-problem

编辑:代码已修复。

我正在尝试使用动态编程来解决下面的问题,但它给出了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]

0 个答案:

没有答案