《怪物獵人崛起》堆攻擊力鈍器物理笛子配裝
阿新 • • 發佈:2021-04-02
動態規劃—揹包問題
根據《演算法圖解》一書中的揹包問題編寫的Python程式碼
該問題的核心部分在於書中所給公式:
cell[i][j] = max(cell[i-1[j], 當前商品價值+cell[i-1][j-當前商品重量])
為了方便第一行的計算,給表格增加了第零行和第零列,分別表示無商品和“大小為零”的揹包。那麼對於大小為零這一列,因為裝不下任何商品,它的最大價值應該恆為零。而無商品放入任何揹包,其價值也為零。這樣就得到下面的表格:
完整程式碼
def make_dp_table(table_row,table_col):
return [[0 for i in range (table_col)] for j in range(table_row)]
bag_size = 4 + 1
items = [ None,
'player',
'laptop',
'guitar',
'Iphone',
]
price = {
'player': 3000,
'laptop': 2000,
'guitar': 1500,
'Iphone': 2000,
}
weight = {
'player': 4,
'laptop': 3,
'guitar': 1,
'Iphone' : 1,
}
dp_table = make_dp_table(len(items),bag_size)
for item in range(1,len(items)): ## item同時也是行索引
key = items[item] ##取出字典的索引
for size in range(1,bag_size): ## size同時也是列索引
if size >= weight[key]: ## 如果能放下物品,檢查是否有新的最大價值
temp = size-weight[key] if size-weight[key] > 0 else 0
dp_table[item][size] = max(dp_table[item-1][size],price[key]+dp_table[item-1][temp])
else: dp_table[item][size] = dp_table[item-1][size] ##如果揹包放不下該商品則當前最大價值與上一行相同
print(dp_table[-1][1:])
輸出結果
[2000, 3500, 3500, 4000]
符合預期