回溯法解決0 1揹包問題(c )

2021-10-10 18:44:50 字數 1425 閱讀 6368

用回溯法解決0-1揹包問題時,其解空間有長度為n的0-1向量組成,並可以組織成高度為n+1滿二叉樹。二叉樹的結點按層次遍歷的順序從上到下、從左到右的順序編號(從1開始)。

採用回溯法解決問題時,可以使用約束條件對左子樹進行剪枝,使用限界條件對右子樹進行剪枝。

在本題中,約束條件為tw+w[i]<=c,限界條件為tv+rv[i]>maxv

有多組資料。

每組資料報含三行。

第一行包含兩個整數c(1 <= c <= 10000)和n(1 <= n <= 20),分別表示揹包的容量和物品的個數。

第二行包含n個整數,依次表示第i個物品的重量w(0 <= w[i] <= 100)。

第三行包含n個整數,依次表示第i個物品的價值v(0 <= v[i] <= 100)。

對於每組輸入資料

程式先依次輸出擴充套件結點的編號、訪問該結點時揹包中物品的重量tw及揹包中物品的價值tv,每個結點一行;

然後輸出最優值maxv和最有解x(0/1向量)並換行。

解向量x的每個元素後乙個空格,其他資料以空格分隔。

輸入

5 34 3 2

5 2 1

輸出1 0 0

2 4 5

5 4 5

11 4 5

5 1 0 0

#include 

using namespace std;

void

lp(int i, int tw, int tv, int op[

],int n, int maxw, int& maxv, int weightarray[

], int valuearray[

], int maxarray[

], int h)}}

else

int rv =0;

for(int d = i +

1; d < n; d++)if

(tv + rv > maxv)}}

int main()

int* oparray =

newint

[n];

for(int i =

0; i < n; i++

)for

(int i =

0; i < n; i++

) int h =1;

lp(0,

0,0, oparray, n, maxw, maxvalue, weightarray, valuearray, maxarray, h)

;// 輸出最優解

cout << maxvalue <<

" ";

for(int i =

0; i < n; i++

) cout << endl;

}return0;

}

回溯法解決0 1揹包問題

1.回溯法可以看作是窮舉法的一種實現方式 2.基本過程 每一步只生成解的一部分 部分解 並立即對該部分解進行評估,若有可能擴充套件成為 所求解 則繼續擴充套件,得到新的部分解,泛指嘗試其他部分解,知道窮盡所有可能.3.解空間 所有的可能的解的集合 解空間樹 將解空間組織成樹形成的樹形結構 常見的解空...

回溯法解決01揹包問題

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

回溯法解決0 1揹包問題

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