(1)0-1揹包問題
思路:構造乙個二叉樹,每個商品都有兩種狀態,要或者不要。如果要就在這個節點的左枝掛子節點,如果不要就在右節點掛子節點。如果全部商品都分配完狀態之後就回溯,回溯到乙個還有其他選擇的節點,接著往這個選擇發展節點,然後再回溯,然後再往下。。。。 直到無路可走,就結束了。
假如限制重量是10,總共有四個商品,重量分別是2, 5, 4, 2 **分別是6, 3, 5, 4。第一輪的路程如5-11圖,第1個商品要,第2個商品要,第3個商品發現裝不下了,所以到第3個節點只能走右節點,並且第3個節點的左節點成為死節點,沒有發展下去的可能了。第4個商品要,此時已經給所有的商品賦予狀態了(要或者不要),記錄下此時所有商品的價值和,記為最優**。接著就開始回溯,如5-13,從節點5先是回溯到節點4(此時購物車有1,2,3選擇不要,4肯定是要的,所以沒必要再發展4節點的右節點),再到節點3(節點三的左節點是死節點),再到節點2,節點2的右節點是可選的,然後接著按照剛開始的邏輯接著往下走就可以了,等繼續走完這一輪,計算最優值,更新下最優值,然後再回溯。。。
剪枝:如果按照上面的邏輯,其實幾乎相當於遍歷了所有的可能性。如果有4個商品,就會有2的4次方種可能,有些不可能是最優結果的分支直接就剪掉就可以了,比如,如果按照上面的邏輯是會有:1不要2不要3不要4不要這個分支。所以如果發現揹包可以把剩下的商品都裝入的情況,就直接給剩餘的商品賦值為要就可以了。當1不要2不要的時候,3和4可以都裝入揹包,直接都要就可以了。沒必要再走3不要的分支(直接設定成死節點)。或者也可以判斷就算把剩餘的都加進包裡,總價值也小於當前最優值,當前這條路也沒必要走了。
**:1 <?php2 $w = [2, 5, 4, 2];3 $v = [6, 3, 5, 4];4 $current = getnode(0);5 $count = count($w);6 list($limit, $best, $cw, $cp, $bestmap, $map) = [10, 0, 0, 0, array(), array()];7 $noback = true;8
9 while (1) elseif (is_object($current->l)|| $current->l === false) elseif ($cw + $w[$current->level] <= $limit) else29 $current = & $node;30 } else 34 while (1) 40 if (isset($map[$current->level])) 45 if ($current->l === null || $current->r === null) 49 }50 }51 unset($node);52 }53
54 function getnode($level, & $p = null) 60
61 print_r([『map『 => $bestmap, 『val『 => $best]);
原文:
回溯 皇后 演算法筆記 演算法筆記
分治演算法 線性時間選擇 o n 33 隨機線性選擇 偽 o n int partition type a,int p,int r return table n 1 w 1 main function else else lowcost i 0 for int i 1 i n i int temp ...
回溯 皇后 演算法筆記 演算法筆記
遞迴演算法 能夠用遞迴解決的問題需要滿足三個條件 原問題可以轉換為乙個或多個子問題來求解,而這些子問題的求解方法和原問題完全相同,只是規模不同 遞迴呼叫次數必須是有限的 必須有結束遞迴的條件 遞迴出口 來終止遞迴。設計遞迴演算法模式先求解問題的遞迴模型。在設計遞迴演算法的時候,如果糾結遞迴樹的每乙個...
回溯 皇后 演算法筆記 回溯演算法 N皇后問題
n 皇后問題研究的是如何將 n 個皇后放置在 n n 的棋盤上,並且使皇后彼此之間不能相互攻擊。上圖為 8 皇后問題的一種解法。給定乙個整數 n,返回所有不同的 n 皇后問題的解決方案。每一種解法包含乙個明確的 n 皇后問題的棋子放置方案,該方案中 q 和 分別代表了皇后和空位。示例 輸入 4 輸出...