动态规划 —— 背包问题 P06 —— 分组背包
生活随笔
收集整理的這篇文章主要介紹了
动态规划 —— 背包问题 P06 —— 分组背包
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【問題】
有N件物品和一個容量為V的背包。第i件物品的體積w[i],價值是c[i]。這些物品被劃分為若干組,每組中的物品互相沖突,最多選一件。
求:將哪些物品裝入背包可使這些物品的費用總和不超過背包容量,且價值總和最大。
【算法】
這個問題變成了每組物品有若干種策略:是選擇本組的某一件,還是一件都不選。
設f[k][v]表示前k組物品花費費用v能取得的最大權值,則有:f[k][v]=max{f[k-1][v],f[k-1][v-w[i]]+c[i] | 物品i屬于第k組}
使用一維數組的偽代碼如下:
for 所有的組kfor v=V..0for 所有的i屬于組kf[v]=max{f[v],f[v-w[i]]+c[i]}注意這里的三層循環的順序,“for v=V..0”這一層循環必須在“for 所有的i屬于組k”之外。這樣才能保證每一組內的物品最多只有一個會被添加到背包中。
另外,可以對每組內的物品應用P02中“一個簡單有效的優化”。
?
總結
以上是生活随笔為你收集整理的动态规划 —— 背包问题 P06 —— 分组背包的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最大子矩阵(信息学奥赛一本通-T1282
- 下一篇: Milking Time(POJ-361