1.
問題描述:已知有n個物品和乙個可以容納m重量的揹包,每種物品i的重量為weight,乙個只能全放入或者不放入,求解如何放入物品,可以使揹包裡的物品的總效益最大。
2.設計思想與分析:對物品的選取與否構成一棵解樹,左子樹表示不裝入,右表示裝入,通過檢索問題的解樹得出最優解,並用結點上界殺死不符合要求的結點。
(多謝shadow同學提供該演算法)
#include
struct
good
;int
number=0
;//物品數量
intupbound=0
;int
curp=0
, curw=0
;//當前效益值與重量
intmaxweight=0
;good
*bag =
null
;void
init_good
()
}int
getbound
(int
num,
int*
bound_u
)//返回本結點的c限界和u限界
*bound_u
=p +
bag [
num ]
. benefit
;return
(p +
bag [
num ]
. benefit*(
(maxweight
-w )
/bag [
num ]
. weight))
; }
void
lcbag
()
} }
void
display
()
0 1揹包(分支限界法)
分支限界法 分支限界法 branch and bound method 是求解純整數規劃或混合整數規劃問題的經典方法,在上世紀六十年代由land doig和dakin等人提出。這種方法靈活且便於用計算機求解,目前已經成功運用於求解生產進度問題 旅行推銷員問題 工廠選址問題 揹包問題及分配問題等。演算...
0 1揹包問題 分支限界法
0 1揹包問題可描述為 n個物體和乙個揹包。對物體i,其價值為value,重量為weight,揹包的容量為w 如何選取物品裝入揹包,使揹包中所裝入的物品總價值最大?2.1 用到的資料結構 class goods 定義貨物資料型別 class knapsack 揹包 2.2 演算法步驟1 定 空間。x...
分支限界法 0 1揹包問題
分支限界法類似於回溯法,也是在問題的解空間上搜尋問題解的演算法。一般情況下,分支限界法與回溯法的求解目標不同。回溯法的求解目標是找出解空間中滿足約束條件的所有解,而分支限界法的求解目標則是找出滿足約束條件的乙個解,或是在滿足約束條件的解中找出使某一目標函式值達到極大或極小的解,即在某種意義下的最優解...