問題描述
揹包的容量爲C,現有N件物品,價格分別爲p[0],p[1]......p[n-1].重量分別爲:w[0],w[1]......w[n-1].從N件物品中選擇任意個放入揹包中,使得物體的價值最大並且總重量不超過揹包的容量C。
採用數學語言描述如下:
在 w[0]*x[0] + w[1] *x[1]+....... +w[n-1]*x[n-1] < C, x[i] = 0 或1 的條件下
求 p[0]*x[0] + p[1] *x[1]+....... +p[n-1]*x[n-1] 的最大值。
分枝界限介紹
分枝界限可以說是dfs和bfs的結合,綜合了DFS算法空間複雜度低和BFS時間複雜度低的優點。分枝界限法在回溯法的基礎上更進了一步,在回溯法中,一旦從問題狀態空間樹導出的解不滿足約束函數,我們就將其分枝剪掉。在處理此類問題時,回溯法的思想可以進一步強化。在回溯法的基礎上加上兩個額外的條件就變成了分支界限法
1. 對於一棵狀態空間樹的每一個結點所代表的部分解, 我們要提供一種算法,計算出通過這個部分解所繁衍也的任何解在目標函數
上的最佳邊界。
2. 目前所求得的最佳解。
有了這兩個條件,我們可以用當前求得的最佳解和所有結點的最佳邊界比較,如果某結點的最佳邊界不能超越當前最佳解(在求最大化問題
中,該結點的最佳上界不大於當前最佳解,在求最小化問題中,該結點的最佳下界不小於當前最佳解),則將其剪掉。這就是分枝界限的主要相思。
問題分析。
在揹包問題中,怎樣求最佳邊界呢,最簡單的一種求法是將物品的按價值重量比(p[i]/w[i])排序,將已經選擇好的物品總價值currentValue加上揹包剩餘重量C-currentWeight(currentWeight爲當前揹包中物品的總重量)與剩下物品最價值重量比(p[i]/w[i])的積:
ub = currentValue + (C-currentWeight)*(p[i]/w[i]);
當然還有更優的求最佳上界的方法。
下面,舉一個最簡單的例子來說明
揹包的容量爲10,有4個物品,重量分別爲4,5,7,4。價值分別爲40,42,28,20。按價值/重量排序如下
物品 重量 價值 價值/重量
1 4 40 10
2 7 42 6
3 5 25 5
4 3 12 4
用c,v,w,ub分別表示揹包的容量,當前揹包內物品的價值,當前揹包內物品的總重量,結點的最佳上界,用二叉樹來表示
代碼如下: