php 0 1揹包回溯

2022-01-12 06:15:20 字數 1617 閱讀 1120

<?

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到...