1. 程式人生 > 遊戲攻略 >《怪物獵人崛起》堆攻擊力鈍器物理笛子配裝

《怪物獵人崛起》堆攻擊力鈍器物理笛子配裝

動態規劃—揹包問題

根據《演算法圖解》一書中的揹包問題編寫的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]

符合預期