用回溯法求解0 1揹包問題,並輸出問題的最優解

2021-08-26 12:56:30 字數 594 閱讀 9862

問題:給定n種物品和一揹包。物品i的重量是wi,其價值為vi,揹包的容量是c,問應如何選擇裝入揹包中的物品,使得裝入揹包中物品的總價值最大。

0—1揹包問題是乙個子集選取問題,適合於用子集樹表示0—1揹包問題的解空間。在搜尋解空間樹是,只要其左兒子節點是乙個可行結點,搜尋就進入左子樹,在右子樹中有可能包含最優解是才進入右子樹搜尋。否則將右子樹剪去。

int c;//揹包容量

int n; //物品數

int *w;//物品重量陣列

int *p;//物品價值陣列

int cw;//當前重量

int cp;//當前價值

int bestp;//當前最優值

int *bestx;//當前最優解

int *x;//當前解

int knap::bound(int i)//計算上界

void knap::backtrack(int i)//回溯

int knapsack(int p,int w,int c,int n) //為knap::backtrack初始化

【詳細設計】

#includeusing namespace std; class knap }

0 1揹包問題使用回溯法

對於0 1 揹包問題可以用動態規劃演算法解決,這裡先不說這種方法。只介紹回溯法,0 1揹包問題的回溯法解決的解空間是子集樹。下面給出最簡潔的 比較方便理解呢 include includeusing namespace std int n,c,bestp 物品的個數,揹包的容量,最大價值 int p...

回溯法求解01揹包問題

在前面文章我們使用動態規劃求解了揹包問題,時間複雜度是o cn 當我們的c的值非常大的時候,說消耗的時間也是非常大的!接下來我們就使用回溯法來求解這個問題,其時間複雜度為o n2n 這個結果當我們的c的值是小於2n 的時候,該演算法所需的時間是小於動態規劃的!既然使用了回溯法,我們就的構造解析樹,因...

回溯法求解0 1揹包問題

include using namespace std struct dot void getvalue int weight,int value void calculate int weight,int value else while deep 6 else int main 選擇第1個 當前...