回溯法 01揹包問題

2021-09-17 04:33:05 字數 1668 閱讀 1103

問題 :有n個重量為的物品,其價值是要求總重量為w,用0-1表示是否選擇該物品,問如何選擇價值最大

問題分析:這是乙個求最優解問題 要求得乙個序列x[n]陣列 ,x[i]=0表示不取該物品,x[i]=1表示取。

深搜:

#include

#include

#include

using namespace std;

#define maxn 100

int n =4;

//物品數量

int w =6;

//限制重量為6

int w=

;int v=

;int x[maxn]

;//存放最終解

int maxv;

//存放最優解的總價值

void

knapsack

(int i,

int tw,

int tv,

int op)

}else

}void

display()

cout << endl;

}int

main()

由最大價值可以剪枝 左孩子剪枝後的**如下:

#include

#include

#include

using namespace std;

#define maxn 100

int n =4;

//物品數量

int w =6;

//限制重量為6

int w=

;int v=

;int x[maxn]

;//存放最終解

int maxv;

//存放最優解的總價值

void

knapsack

(int i,

int tw,

int tv,

int op)

}else

op[i]=0

;knapsack

(i +

1, tw, tv, op);}

}void

display()

cout << endl;

}int

main()

#include

#include

#include

using namespace std;

#define maxn 100

int n =4;

//物品數量

int w =6;

//限制重量為6

int w=

;int v=

;int x[maxn]

;//存放最終解

int maxv;

//存放最優解的總價值

void

knapsack

(int i,

int tw,

int tv,

int rw,

int op)

}else

if(tw + rw > w)}}

void

display()

cout << endl;

}int

main()

回溯法 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個 ...