問題:給定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個 當前...