回溯法 01揹包

2021-09-29 11:05:02 字數 1606 閱讀 4408

給定一組多個(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陣列是...