使用回溯算法結合遞歸樹+備忘錄解決01背包問題


問題描述:

對於一組不同重量、不可分割的物品,我們需要選擇一些裝入背包,在滿足背包最大重量限制的條件上下,背包中物品總重量的最大值是多少呢?

比如對於一組物品,重量如下

(2,2,4,6,3)

畫出遞歸樹

虛線框表示預判斷,放了之后超了,表示不執行了
有顏色的框表示之前的分支已經執行過了,有重復,不再執行。
相當於剪枝,大大降低了時間復雜度

相應的代碼實現

max_w = -1  # 總重量
weight = [2,2,4,6,3]  # 物品重量
n = 5  # 物品個數
capacity = 9 # 背包承受的最大重量

mem = {} # 備忘錄

def bag01(idx, cur_w):
    global max_w
    
    if cur_w == capacity or idx == n:
        
        if cur_w>max_w:
            max_w = cur_w
        
        return
    
    bag01(idx + 1 ,cur_w)
    if (cur_w + weight[idx]) <= capacity:
        bag01(idx + 1 ,cur_w + weight[idx])
    
bag01(0, 0)
print(max_w)

PS:雖然遞歸樹看上去是並行執行的,但遞歸的過程是壓棧執行的,是順序一條分支一條分支執行的,所以可以
只用一個變量max_w保存當前的總重量,只要判斷下此條分支的總重要是否比之前分支的放法更好即可


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM