我對一個揹包問題DP解決方案工作的所有解決方案。有一個項目的列表與他們的重量和價值,我需要找到最大總值小於某個預定義權重的項目。沒什麼特別的,只是0-1 knapsack。如何獲得從揹包DP矩陣
我用DP來生成矩陣:
def getKnapsackTable(items, limit):
matrix = [[0 for w in range(limit + 1)] for j in xrange(len(items) + 1)]
for j in xrange(1, len(items) + 1):
item, wt, val = items[j-1]
for w in xrange(1, limit + 1):
if wt > w:
matrix[j][w] = matrix[j-1][w]
else:
matrix[j][w] = max(matrix[j-1][w], matrix[j-1][w-wt] + val)
return matrix
其中數據項的元組(name, weight, value)
的列表。現在有一個DP矩陣,他的最大可能值是右下位置的數字。我也可以回溯矩陣以找到提供最佳解決方案的項目列表。
def getItems(matrix, items):
result = []
I, j = len(matrix) - 1, len(matrix[0]) - 1
for i in range(I, 0, -1):
if matrix[i][j] != matrix[i-1][j]:
item, weight, value = items[i - 1]
result.append(items[i - 1])
j -= weight
return result
太好了,現在我可以得到結果:
items = [('first', 1, 1), ('second', 3, 8), ('third', 2, 5), ('forth', 1, 1), ('fifth', 1, 2), ('sixth', 5, 9)]
matrix = getKnapsackTable(items, 7)
print getItems(matrix, items)
,將看到:[('fifth', 1, 2), ('third', 2, 5), ('second', 3, 8), ('first', 1, 1)]
。
問題是這不是一個獨特的解決方案。取而代之的是'first'
元素,我可以採取'forth'
元素(這絕對是一樣的,但有時的解決方案可以是不同的)。我想弄清楚如何得到所有的解決方案,而不是一個。我意識到這將需要更多時間,但我確定。