問題:
有n件物品和乙個容量為v的揹包。第i件物品的費用是c[i],價值是w[i]。這些物品被劃分為若干組,每組中的物品互相衝突,最多選一件。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。
演算法:
這個問題變成了每組物品有若干種策略:是選擇本組的某一件,還是一件都不選。也就是說設f[k][v]表示前k組物品花費費用v能取得的最大權值,則有:f[k][v]=max。使用一維陣列的偽**如下:
[cpp] view plain copy print?
for 所有的組k
for v=v..0
for 所有的i屬於組k
f[v]=max
注意這裡的三層迴圈的順序,甚至在本文的第乙個beta版中我自己都寫錯了。「for v=v..0」這一層迴圈必須在「for 所有的i屬於組k」之外。這樣才能保證每一組內的物品最多只有乙個會被新增到揹包中。另外,顯然可以對每組內的物品應用p02中「乙個簡單有效的優化」。
小結:
分組的揹包問題將彼此互斥的若干物品稱為乙個組,這建立了乙個很好的模型。不少揹包問題的變形都可以轉化為分組的揹包問題(例如p07),由分組的揹包問題進一步可定義「泛化物品」的概念,十分有利於解題。
通天之分組揹包 分組揹包
本人水平有限,題解不到為處,請多多諒解 本蒟蒻謝謝大家 題目 傳送門 分組揹包的模板 偽 1 for int i 1 i 組數 i 6 7 直接套模板即可。code 1 include2 pragma gcc optimize 3 3const int n 1e5 10 4 using namesp...
混合揹包 分組揹包
啥是混合揹包呢,就是包含01揹包,完全揹包,多重揹包。有n件物品,揹包承重最大為m,w i 代表重量,v i 代表價值,s i 代表種類。s i 1,可用1次,s i 0,可用無限次,s i 0,可用s i 次.解法 見 const int maxn 1e4 5 int n,m,dp m 1 w n...
揹包問題克星 分組揹包
有n件物品,告訴你這n件物品的重量以及價值,將這些物品劃分為k組,每組中的物品互相衝突,最多選一件,求解將哪些物品裝入揹包可使這些物品的費用綜合不超過揹包的容量,且價值總和最大。演算法 首先判斷乙個分組當中的一件物品,同01揹包一樣,此物品存在兩種狀態,取與不取,若取此物品,則繼續判斷下一組的第一件...