*不是家庭作业*
我已经在 python 中实现了背包,并且成功地获得了最佳价值,但是我想扩展这个问题以填充一个表,其中包含所有重量和物品的背包表的所有适当值。
我已经在python中实现了它,我是新手,所以如果有什么我可以改进的,请告诉我,但是这些概念应该适用于任何语言。
values, weights, table = [], [], [[]]
def knapsack(i, W):
global weights, values, table, counter
if (i < 0):
# Base case
return 0
if (weights[i] > W):
# Recursion
return knapsack(i - 1, W)
else:
# Recursion
return max(knapsack(i - 1, W), values[i] + knapsack(i - 1, W - weights[i]))
def main():
global values, weights, table
W = int(input())
values = list(map(int, input().split()))
weights = list(map(int, input().split()))
# initalise table with 0's
table = [[0 for i in range(W)] for i in range(len(values))]
for i in range(len(values)):
for j in range(W):
table[i][j] = 0
# Fill table
print("Result: {}".format(knapsack(len(values) - 1, W)))
printKnapsack(W)
if __name__ == '__main__':
main()
我也有这个打印表方法,它是不相关的,但你可以看到我输出的内容:
def printLine(W):
print(" ",end="")
for i in range(W + 1):
print("-----",end="")
print("")
def printKnapsack(W):
global table
print("\nKnapsack Table:")
printLine(W)
print("| k\w |", end="")
for i in range(W):
print("{0: >3} |".format(i + 1), end="")
print("")
printLine(W)
for i in range(len(values)):
print("| {} |".format(i+1), end="")
for j in range(W):
print("{0: >3} |".format(table[i][j]), end="")
print("")
printLine(W)
这是示例输入:
10
18 9 12 25
5 2 4 6
这是应该输出的内容:
Result: 37
Knapsack Table:
-------------------------------------------------------
| k\w | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
-------------------------------------------------------
| 1 | 0 | 0 | 0 | 0 | 18 | 18 | 18 | 18 | 18 | 18 |
-------------------------------------------------------
| 2 | 0 | 9 | 9 | 9 | 18 | 18 | 27 | 27 | 27 | 27 |
-------------------------------------------------------
| 3 | 0 | 9 | 9 | 12 | 18 | 21 | 27 | 27 | 30 | 30 |
-------------------------------------------------------
| 4 | 0 | 9 | 9 | 12 | 18 | 25 | 27 | 34 | 34 | 37 |
-------------------------------------------------------
我在knapsack(i, W)
函数中尝试了多条不同的行来将元素添加到表中,并且我已经将其绘制出来,但我无法理解递归如何工作得足够好,以找出要放入哪些索引来添加未解开的递归调用值到。
这是我必须解决的方法。
def knapsack(i, W):
global weights, values, table, counter
if (i < 0):
# Base case
return 0
if (weights[i] > W):
# Recursion
table[?][?] = ?
return knapsack(i - 1, W)
else:
# Recursion
table[?][?] = ?
return max(knapsack(i - 1, W), values[i] + knapsack(i - 1, W - weights[i]))