0 1揹包問題(回溯法)

2022-07-25 19:57:11 字數 1007 閱讀 4240

用回溯法解問題時,應明確定義問題的解空間。問題的解空間至少包含問題的乙個(最優)解。對於 n=3 時的 0/1 揹包問題,可用一棵完全二叉樹表示解空間,如圖所示:

1)針對所給問題,定義問題的解空間;

2)確定易於搜尋的解空間結構;

3)以深度優先方式搜尋解空間,並在搜尋過程中用剪枝函式避免無效搜尋。

常用的剪枝函式:用約束函式在擴充套件結點處剪去不滿足約束的子樹;用限界函式剪去得不到最優解的子樹。

回溯法對解空間做深度優先搜尋時,有遞迴回溯和迭代回溯(非遞迴)兩種方法,但一般情況下用遞迴方法實現回溯法。

解 0/1 揹包問題的回溯法在搜尋解空間樹時,只要其左兒子結點是乙個可行結點,搜尋就進入其左子樹。當右子樹中有可能包含最優解時才進入右子樹搜尋。否則將右子樹剪去。

**:

public

class

knapsack_problem01 ; //

第i個物品的重量

int v = ; //

第i個物品的價值

int a = new

int[n]; //

記錄在樹中的移動路徑,為1的時候表示選擇該組資料,為0的表示不選擇該組資料

int maxvalue = 0; //

揹包的最大權重值

public

static

void

main(string args)

public

void search(int i) //

i表示遞迴深度

else

}public

void

checkmax()

}if(weight <=m)

system.out.print('\n');}}

}}

回溯法 0 1揹包問題

0 1揹包問題 給定n種物品和一揹包.物品i的重量是wi,其價值為ui,揹包的容量為c.問如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大?分析 0 1揹包是子集合選取問題,一般情況下0 1揹包是個np問題.第一步 確定解空間 裝入哪幾種物品 第二步 確定易於搜尋的解空間結構 可以用陣列p,w...

0 1揹包問題 回溯法

0 1揹包問題 回溯法 一 專案描述 每種物品只有2 種選擇,分別為 裝入揹包或不裝入揹包,物品數和揹包容量已給定,計算裝入揹包物品的最大價值和最優裝入方案,用回溯法搜尋子集樹的演算法進行求解。二 演算法設計 a.物品有n種,揹包容量為c,分別用p i 和w i 儲存第i種物品的價值和重量,用x i...

回溯法 0 1揹包問題

include include using namespace std class knap void knap backtrack int i 對第i個物品進行操作 return 如果沒有到葉子節點,就要對這個節點進行操作,即搜尋它的子樹,進入做左子樹表示可以選第i個,進入右子樹表示不能選第i個 ...