問題描述:
對於一組不同重量、不可分割的物品,我們需要選擇一些裝入背包,在滿足背包最大重量限制的條件上下,背包中物品總重量的最大值是多少呢?
比如對於一組物品,重量如下
(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保存當前的總重量,只要判斷下此條分支的總重要是否比之前分支的放法更好即可
