<?phpheader("
content-type:text/html;charset=utf-8");
/***@description
*搜尋一顆深度為n(n=物品數量)的樹,根節點即第乙個物品,如果根接點的重量未超過限定重量,則根左右子節點都是第二個物品,如果超過,則第二個物品只作為左子節點。
*主要思想是,符合限定條件的節點,將搜尋左右子樹,不符合的的節點,將只搜尋左子樹
*假設w = (2,3,4) p = (4,5,6),限重量為7,則最終搜尋樹為
20/ \1
3 3
0/ \1 0/ \1
4 4 4 4
0|1 0|1 0|1 0|
(4) (3)(3,4) (2)(2,4)(2,3) --- 最終可能解,只需判斷物品價值最高的一組
*上圖中0,1分別代表當前節點是否疊加/或\線上面的節點重量
*假設以上資料,限重變成了4,則最終搜尋樹為
20/ \1
3 3 (因為3 + 2 > 4,所以只搜尋左子樹)
0/ \1 0/
4 4 4
0|1 0| 0|
(4) (3) (2) --- 最終可能解,判斷價值最高的一組
*/class
bag01_bt
public
function
backstracking( $n=
0)return
false;}
//if
($this
->
cw +
$this
->
weight[
$n]
<=
$this
->
limitw)
//不記錄當前節點,不疊加當前物品重量,搜尋左子樹
$this
->
cx[$n] =
0;$this
->
backstracking( $n+
1);}}
$weight
=array(2
,3,44
,5,15
,12);$price
=array(5
,5,8
,17,3
,7); $limitw=30
;$bag
=new
bag01_bt(
$limitw
,$weight
,$price
);$bag
->
backstracking( );
echo""
;echo
"最優解:";
echo
$bag
->bp.
"";echo
"物品:";
foreach
($bag
->
x as
$k=>$v)
print_r
($items
);?>
回溯 0 1揹包問題
回溯演算法的要點 1,針對所給問題,定義問題的解空間。2,確定容易搜尋的解空間的組織結構。3,通過剪枝優化搜尋過程。下面通過求解0 1揹包問題來分析使用回溯演算法的過程 1,根據問題的描述,設所有的物件數是n,對應的重量和價值分別為w 0 n 1 和v 0 n 1 於是這個問題就轉化成在這n件物件中...
01揹包回溯法
計算機演算法基礎 第三版 余祥宣 崔國華 等 華中科技大學出版社 中回溯法解決01揹包問題 演算法思想 基於貪心演算法的回溯演算法 w p陣列是按照效益p w拍好序的陣列 include const int n 8 物品個數 const int m 110 int w n 1 重量陣列,從1開始 i...
0 1揹包(回溯法)
描述 需對容量為c 的揹包進行裝載。從n 個物品中選取裝入揹包的物品,每件物品i 的重量為wi 價值為pi 對於可行的揹包裝載,揹包中物品的總重量不能超過揹包的容量,最佳裝載是指所裝入的物品價值最高。輸入 多個測例,每個測例的輸入佔三行。第一行兩個整數 n n 10 和c,第二行n個整數分別是w1到...