python數據結構:博物館大盜問題

博物館大盜問題

❖大盜潛入博物館,面前有5件寶物,分別有重量和價值,大盜的揹包僅能負重20公斤,請問如何選擇寶物,總價值最高?
item weight value
1 2 3
2 3 4
3 4 8
4 5 8
5 9 10
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-5RSlg7IQ-1584154561746)(attachment:1.png)]
❖我們把m(i,W)記爲:
前i(1<=i<=5)個寶物中,組合不超過W(1<=W<=20)重量,
得到的最大價值m(i, W)應該是m(i-1, W)和m(i-1, W-Wi)+vi兩者最大值
我們從m(1, 1)開始計算到m(5, 20)
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-IIZYoDAc-1584154561748)(attachment:2.png)]

遞歸+記憶表(備忘錄)代碼實現

#寶物的重量和價值
tr={(2,3),(3,4),(4,8),(5,8),(9,10)}
#大盜的最大承重
max_w=20

#初始化記憶表m
#字典中的鍵key是(寶物組合,最大重量),value是最大價值
m={}

def thief(tr,w): 
    #如果寶物tr是空集或者盜賊拿走的寶物重量爲0,則直接返回0
    if tr==set()or w==0:
        m[(tuple(tr),w)]=0 #元組tuple是鍵key的要求
        return 0
    #記憶表功能
    elif (tuple(tr),w) in m:
        return m[(tuple(tr),w)]
    #遞歸
    else:
        vmax=0 #初始值設爲0
        for t in tr:
            if t[0] <= w:
                #逐個從集合中去掉某個寶物,減小規模,遞歸調用
                v=thief(tr-{t},w-t[0]) +t[1]
                #選出所以價值中的最大值
                vmax=max(vmax,v)
        m[(tuple(tr),w)]=vmax
        return vmax

#輸出結果
print(thief(tr,max_w))
29
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章