經典 揹包問題(二)

2022-08-24 14:00:18 字數 977 閱讀 7648

分組揹包

有n件物品和乙個容量為v的揹包。第i件物品的費用是c[i],價值是w[i]。這些物品被劃分為若干組,每組中的物品互相衝突,最多選一件。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。 

主要是對01揹包的原始迴圈進行理解,外層i代表了物品的遍及數,內層代表了動規基本單元,增加乙個分組,通過v內層限制,由於是從v到v遍歷,裡面最大值只會使用乙個。動態規劃方程為f[k][v]=max。偽**是

for 所有的組k   

for v=v..0

for 所有的i屬於組k

f[v]=max

依賴揹包

通過構造分組揹包來完成。比如如果有乙個主件,它最多有兩個附件。那麼這樣乙個情況就可以看成乙個組:乙個物品是主件,第二個是主件+附件a,第三個是主件+附件b,第四個是主件+兩個附件,四個物品最多選一件,也可以都不選。 

更一般的,情況更加複雜,

泛化揹包

考慮這樣一種物品,它並沒有固定的費用和價值,而是它的價值隨著你分配給它的費用而變化。乙個泛化物品就是乙個陣列h[0..v],給它費用v,可得到價值h[v]。通過泛化物品,可以對前面的7個揹包問題做乙個高度更高的理解:

乙個費用為c價值為w的物品,如果它是01揹包中的物品,那麼把它看成泛化物品,它就是除了h(c)=w其它函式值都為0的乙個函式。如果它是完全揹包中的物品,那麼它可以看成這樣乙個函式,僅當v被c整除時有h(v)=v/c*w,其它函式值均為0。如果它是多重揹包中重複次數最多為n的物品,那麼它對應的泛化物品的函式有h(v)=v/c*w僅當v被c整除且v/c<=n,其它情況函式值均為0。 乙個物品組可以看作乙個泛化物品h。對於乙個0..v中的v,若物品組中不存在費用為v的的物品,則h(v)=0,否則h(v)為所有費用為v的物品的最大價值。p07中每個主件及其附件集合等價於乙個物品組,自然也可看作乙個泛化物品。

求解某個泛化物品的一種方法就是將它表示為若干泛化物品的和然後求之。如兩個泛化物品的揹包問題動規方程為:f(v)=max

經典揹包問題 01揹包 完全揹包 多重揹包

1 for int i 0 i 2for int j w j size i j 3 f j max f j f j size i value i 1 for int i 0 i 2for int j size i j w j 3 f j max f j f j size i value i f w ...

經典01揹包問題

乙個旅行者有乙個最多能裝m公斤的揹包,現在有n件物品,它們的重量分別是w1,w2,wn,它們的價值分別為c1,c2,cn。求旅行者能獲得最大總價值。第 1 行 兩個整數,m 揹包容量,m 200 和n 物品數量,n 30 第 2 到 n 1行 每行兩個整數 wi,ci,表示每個物品的重量和價值。10...

經典的揹包問題

揹包問題i 難度級別 b 執行時間限制 1000ms 執行空間限制 51200kb 長度限制 2000000b 試題描述 有乙個揹包容積為 v 和 n 個物品,並給出每個物品有乙個體積。要求從 n 個物品中,任取若干個裝入揹包內,使揹包的剩餘空間為最小。輸入第一行兩個正整數 v 和 n,分別表示揹包...