回溯法解決0 1揹包問題

2021-07-25 07:31:02 字數 1040 閱讀 3357

1.回溯法可以看作是窮舉法的一種實現方式

2.基本過程:

每一步只生成解的一部分(部分解),並立即對該部分解進行評估,若有可能擴充套件成為'所求解',則繼續擴充套件,得到新的部分解,泛指嘗試其他部分解,知道窮盡所有可能.

3.解空間:所有的可能的解的集合

解空間樹:將解空間組織成樹形成的樹形結構

常見的解空間樹:

子集樹:任何解向量的每個分量x

i取值與乙個集合sn=

排列樹:解向量是某集合s是全排列

4.回溯法搜尋解空間樹時,通常採用兩種策咯避免無效搜尋,提高回溯法的搜尋效率,

其一就是用約束函式在擴充套件結點處剪去不滿足約束的子樹

其二就是用限界函式剪去不可能得到最優解的子樹

這兩類函式統稱為剪枝函式

5.解題步驟:

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

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

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

6.演算法框架

(1)遞迴回溯搜尋子集樹

void backtrack(int t)

else

} }

(2)遞迴回溯搜尋排列樹

void backtrack(int t)

else

} }

利用回溯法解決0-1揹包問題時

在構建子集樹時,從揹包v/w最大的物品開始深度搜尋,即先將物品按照v/w進行快速排序。

public class qsort 

void swap(int i,int j)

int patition(int p,int q)

swap(p,j);

return j;

} void qsort(int p,int q)

if(bound(t)>bestp)//判斷右子樹,左子樹滿足約束函式那麼右子樹一定滿足約束函式

backtrack(t+1);

}

回溯法解決01揹包問題

一 問題描述 有n 個物品,它們有各自的重量和價值,現有給定容量的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?二 總體思路 因為回溯求解的規則是 後進先出 所以要用棧來存放符合條件的解,在儲存過程中用陣列來存放各個物品的體積和價值,然後用深度優先搜尋的方式求解,最後得到符合條件的最優解並輸出。三...

回溯法解決0 1揹包問題

問題描述 有n件物品和乙個容量為 c的揹包。第 i件物品的價值是 v i 重量是 w i 求解將哪些物品裝入揹包可使價值總和最大。所謂01揹包,表示每乙個物品只有乙個,要麼裝入,要麼不裝入。回溯法 01揹包屬於找最優解問題,用回溯法需要構造解的子集樹。在搜尋狀態空間樹時,只要左子節點是可乙個可行結點...

回溯法解決0 1揹包問題

0 1揹包問題指的是有乙個能裝w重的揹包,和n個不同重量的物體,如何選擇物體才能盡可能地裝滿揹包。public int maxw integer.min value 儲存揹包中物品總重量的最大值 cw表示當前已經裝進去的物品的重量和 i表示考察到哪個物品了 w揹包重量 items表示每個物品的重量 ...