給定一組多個(n
)物品,每種物品都有自己的重量
(w1,
w2,.
..,w
nw_1,w_2,...,w_n
w1,w2
,..
.,wn
)和價值
(v1,
v2,.
..,v
nv_1,v_2,...,v_n
v1,v2
,..
.,vn
),在限定的總重量
/總容量(c)內,選擇其中若干個(也即每種物品可以選0個或1個),設計選擇方案使得物品的總價值最高
。
當物品數不多,可以利用回溯法(子集樹模板),遍歷每一條路徑,利用重量限制剪枝
,最終選取滿足條件的最大值
。
class
subsettree
:def
__init__
(self)
: self.a =
# 資料列表
self.w =
self.n =
0# 資料長度
self.sumval =
0 self.res =
0 self.sumwei =
0 self.c =
0# 子集樹遞迴模板
defbacktrack
(self, k)
:if k >= self.n:
#遍歷到底
pass
else
:for i in[1
,0]:
# 遍歷元素 a[k] 的兩種選擇狀態:1-選擇,0-不選
if i==1:
self.sumval += self.a[k]
self.sumwei += self.w[k]
if self.sumwei <= self.c:
#非剪枝條件
self.res =
max(self.res, self.sumval)
self.backtrack(k+1)
if i==1:
self.sumval -= self.a[k]
self.sumwei -= self.w[k]
defsovle01bag
(self, w, a, c)
: self.w = w
self.a = a
self.c = c
self.n =
len(w)
self.backtrack(0)
return self.res
if __name__ ==
'__main__'
: test = subsettree(
) w =[2
,2,6
,5,4
] v =[6
,3,5
,4,6
] res = test.sovle01bag(w,v,10)
print
(res)
01揹包回溯法
計算機演算法基礎 第三版 余祥宣 崔國華 等 華中科技大學出版社 中回溯法解決01揹包問題 演算法思想 基於貪心演算法的回溯演算法 w p陣列是按照效益p w拍好序的陣列 include const int n 8 物品個數 const int m 110 int w n 1 重量陣列,從1開始 i...
0 1揹包(回溯法)
描述 需對容量為c 的揹包進行裝載。從n 個物品中選取裝入揹包的物品,每件物品i 的重量為wi 價值為pi 對於可行的揹包裝載,揹包中物品的總重量不能超過揹包的容量,最佳裝載是指所裝入的物品價值最高。輸入 多個測例,每個測例的輸入佔三行。第一行兩個整數 n n 10 和c,第二行n個整數分別是w1到...
0 1揹包 回溯法
include include include using namespace std define n 100000 int n,c int cp 0,cw 0,bestp 0 cp是當前價值,cw是當前重量,bestp是當前最優值。int w n p n x n bestx n bestx陣列是...