假期 2020.01
.22
仍然是 0 - 1揹包問題。詳細描述請見回溯演算法–01揹包問題
此處採用分支界限演算法,即bfs演算法實現解決該問題,並且採用優先佇列的儲存方式。
儲存結構,採用建構函式的目的是便於賦值,並且有兩個過載函式,第乙個是初始化陣列,第二個是便於賦值。
struct node
//解向量初始為零
node
(int _cp,
int _rp,
int _rw,
int _id)};
/*揹包資料記錄*/
struct goods goods[max_size]
;
首先將乙個節點入隊
queue q;
//建立佇列
q.push
(node(0
, sum_value, weight,1)
);//壓入乙個初始節點
結束條件是隊列為空,而找到解的結束條件是物品計算完或者揹包空間不夠時,更新最優解
if
(current > count || current_node.rw ==0)
//最後乙個物品時或者沒有剩餘空間時
continue
;}
當滿足限制條件時,即還有空間可容納該物品時
if
(current_rw >= goods[current]
.weight)
//小於揹包容量
;for
(int i =
1; i < current; i++
) lchild.choiced[i]
= current_node.choiced[i]
; lchild.choiced[current]=1
;if(lchild.cp > best)
//最優值更新
best = lchild.cp;
q.push
(lchild)
;//左孩子入隊
}
後續物品不會構成最優解時
if
(current_cp + current_rp >= best)
//滿足條件
;for
(int i =
1; i < current; i++
) rchild.choiced[i]
= current_node.choiced[i]
; rchild.choiced[current]=0
; q.
push
(rchild)
;//右孩子入隊
}
結束該程式,直到隊列為空。
#include
#include
#include
using namespace std;
constexpr auto max_size =20;
int best_choice[max_size]
;//最優方案儲存
int best =
0,weight =
0,count =
0,sum_weight =
0,sum_value =0;
//最優值,最大容量,物品數量,物品總重量,物品總價值
struct node
//解向量初始為零
node
(int _cp,
int _rp,
int _rw,
int _id)};
/*揹包資料記錄*/
struct goods goods[max_size]
;void
bfs(
)continue;}
if(current_node.cp + current_node.rp < best)
//不滿足最優值時
continue
; current_cp = current_node.cp;
current_rp = current_node.rp - goods[current]
.value;
current_rw = current_node.rw;
//剩餘容量
if(current_rw >= goods[current]
.weight)
//小於揹包容量
;for
(int i =
1; i < current; i++
) lchild.choiced[i]
= current_node.choiced[i]
; lchild.choiced[current]=1
;if(lchild.cp > best)
//最優值更新
best = lchild.cp;
q.push
(lchild)
;//左孩子入隊}if
(current_cp + current_rp >= best)
//滿足條件
;for
(int i =
1; i < current; i++
) rchild.choiced[i]
= current_node.choiced[i]
; rchild.choiced[current]=0
; q.
push
(rchild)
;//右孩子入隊}}
實現有所參考《趣學演算法》
分支限界法01揹包問題 01揹包問題
1.01揹包問題的描述 有n個不可分割的物品,它們有各自的重量和價值,現有固定容量的揹包,選擇把哪些物品放入揹包可以讓揹包中物品的價值最大。2.錯覺 按照價值和重量的比值 價效比 進行排序,依次嘗試放入直到放不進揹包為止。但是細想思考一下就能發現,這個貪心演算法是有問題的,看下面乙個例子。揹包容量1...
0 1揹包問題 分支限界法
0 1揹包問題可描述為 n個物體和乙個揹包。對物體i,其價值為value,重量為weight,揹包的容量為w 如何選取物品裝入揹包,使揹包中所裝入的物品總價值最大?2.1 用到的資料結構 class goods 定義貨物資料型別 class knapsack 揹包 2.2 演算法步驟1 定 空間。x...
分支限界法 0 1揹包問題
分支限界法類似於回溯法,也是在問題的解空間上搜尋問題解的演算法。一般情況下,分支限界法與回溯法的求解目標不同。回溯法的求解目標是找出解空間中滿足約束條件的所有解,而分支限界法的求解目標則是找出滿足約束條件的乙個解,或是在滿足約束條件的解中找出使某一目標函式值達到極大或極小的解,即在某種意義下的最優解...