HDU 1712 分組揹包問題

2022-05-17 17:19:36 字數 838 閱讀 9841

物品分多組,每組中的每件都是衝突的,那麼,揹包問題變成,在某組中取乙個,使得價值達到最大,或者這組乙個都不取能使價值達到最大,在01揹包基礎上加乙個迴圈就可以,在減去體積的時候依次減去每組每乙個的體積,這裡的體積正好對應縱座標,所以不必再抽象成c[i]了,價值w[i]

問題有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),由分組的揹包問題進一步可定義「泛化物品」的概念,十分有利於解題。

1 #include2

int max(int a,intb)3

6int

main()722

return0;

23 }

view code

hdu 1712 分組揹包問題

1y很開心。分組揹包就是在01揹包的基礎上分了多個組,每組只能取乙個。這樣在01揹包上再加一重迴圈就可以了。二維的狀態轉移方程 f k,v max 揹包九講的偽 如下 for k 1 to k for v v to 0 for item i in group k f v max 就是先進行每組的遍歷...

HDU 1712 分組揹包問題

題目連線 題意 有m天可以分給n個課程,課程得分和課程上的天數有關,問在m天以內最多一共可以得到多少分 乙個分組揹包的入門題,把乙個課程上不同的天數得到的分數看作是一組的,每組最多只能選乙個物品 每乙個物品的代價是上的天數,價值是這門課在這個天數上得到的分數 那麼這樣就是乙個分組揹包問題 二維dp陣...

hdu 1712 分組揹包

分組的揹包問題 問題 有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 這些物品被劃分為若干組,每組中的物品互相衝突,最多選一件。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。演算法 這個問題變成了每組物品有若干種策略 是選擇本組的某一件,還是一件...