有n件物品和乙個容量為v的揹包。第i件物品的費用是c[i],價值是w[i]。這些物品被劃分為若干組,每組中的物品互相衝突,最多選一件。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。
這個問題變成了每組物品有若干種策略:是選擇本組的某一件,還是一件都不選。也就是說設f[k][v]表示前k組物品花費費用v能取得的最大權值,則有:
f[k][v]=max
使用一維陣列的偽**如下:
for 所有的組k
for v=v..0
for 所有的i屬於組k
f[v]=max注意這裡的三層迴圈的順序,甚至在本文的第乙個beta版中我自己都寫錯了。「for v=v..0」這一層迴圈必須在「for 所有的i屬於組k」之外。這樣才能保證每一組內的物品最多只有乙個會被新增到揹包中。
另外,顯然可以對每組內的物品應用p02中「乙個簡單有效的優化」。
分組的揹包問題將彼此互斥的若干物品稱為乙個組,這建立了乙個很好的模型。不少揹包問題的變形都可以轉化為分組的揹包問題(例如p07),由分組的揹包問題進一步可定義「泛化物品」的概念,十分有利於解題。
P06 分組的揹包問題
有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 這些物品被劃分為若干組,每組中的物品互相衝突,最多選一件。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。這個問題變成了每組物品有若干種策略 是選擇本組的某一件,還是一件都不選。也就是說設f k v ...
06 分組揹包 hdu 1712 3033
內容見 揹包九講 hdu 1712 include includeusing namespace std int f 110 int w 110 110 int n,m void grouppack int main memset f,0,sizeof f grouppack printf d n ...
分組揹包 Acwing 9 分組揹包問題
題目鏈結 有 n 組物品和乙個容量是 v 的揹包。每組物品有若干個,同一組內的物品最多只能選乙個。每件物品的體積是 vij,價值是 wij,其中 i 是組號,j 是組內編號。求解將哪些物品裝入揹包,可使物品總體積不超過揹包容量,且總價值最大。輸出最大價值。輸入格式 第一行有兩個整數 n,v,用空格隔...