使用回溯演算法結合遞迴樹 備忘錄解決01揹包問題

2022-03-29 22:45:11 字數 908 閱讀 6227

問題描述:

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

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

(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儲存當前的總重量,只要判斷下此條分支的總重要是否比之前分支的放法更好即可

用回溯遞迴演算法解決走迷宮問題

迷宮是由許多小方格構成的矩形,在每個小方格中有的是牆,有的是路,走迷宮就是從乙個小方格沿上下左右四個方向到臨近的方格,當然不能穿牆。設迷宮的入口是在左上角 1,1 出口是右下角 8,8 根據給定的迷宮,找出一條從入口到出口的路徑。演算法設計思路 從入口開始廣度優先搜尋所有可到達的方格入隊,再擴充套件...

使用回溯演算法解決 0 1 揹包問題

對於 0 1 揹包問題,我們最高效的方法是使用動態規劃來解決,但其實我們使用回溯演算法也可以解決0 1揹包問題 問題描述 我們有乙個揹包,揹包可承載的重量是wkg。現在我們有n個物品,每個物品的重量不等,並且不可分割,我們現在期待選擇幾件物品裝載到揹包中,在不超過揹包重量的前提下如何讓揹包中物品的總...

Python使用回溯法子集樹模板解決迷宮問題示例

問題 給定乙個迷宮,入口已知。問是否有路徑從入口到出口,若有則輸出一條這樣的路徑。注意移動可以從上 下 左 右 上左 上右 下左 下右八個方向進行。迷宮輸入0表示可走,輸入1表示牆。為方便起見,用1將迷宮圍起來避免邊界問題。分析考慮到左 右是相對的,因此修改為 北 東北 東 東南 南 西南 西 西北...