动态规划 —— 背包问题 P04 —— 混合背包
生活随笔
收集整理的這篇文章主要介紹了
动态规划 —— 背包问题 P04 —— 混合背包
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【概述】
如果將P01、P02、P03混合起來。也就是說,有的物品只可以取一次(01背包),有的物品可以取無限次(完全背包),有的物品可以取的次數有一個上限(多重背包)。應該怎么求解呢?
【01背包與完全背包的混合】
考慮到在P01和P02中給出的偽代碼只有一處不同,故如果只有兩類物品:一類物品只能取一次,另一類物品可以取無限次,那么只需在對每個物品應用轉移方程時,根據物品的類別選用順序或逆序的循環即可,復雜度是O(VN)。
偽代碼:
for i=1..Nif 第i件物品是01背包(只取一次時)for v=V..0f[v]=max{f[v],f[v-w[i]]+c[i]};else if 第i件物品是完全背包(可以取無限多時)for v=0..Vf[v]=max{f[v],f[v-w[i]]+c[i]};【加上多重背包】
如果再加上有的物品最多可以取有限次,那么原則上也可以給出O(VN)的解法:遇到多重背包類型的物品用單調隊列解即可。但如果不考慮超過NOIP范圍的算法的話,用P03中將每個這類物品分成O(log?n[i])個01背包的物品的方法也已經很優了。
當然,更清晰的寫法是調用我們前面給出的三個相關過程。
for i=1..Nif 第i件物品是01背包(只取一次時)ZeroOnePack(c[i],w[i])else if 第i件物品是完全背包(可以取無限多時)CompletePack(c[i],w[i])else if 第i件物品是多重背包(有固定取的次數時)MultiplePack(c[i],w[i],n[i])?
總結
以上是生活随笔為你收集整理的动态规划 —— 背包问题 P04 —— 混合背包的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 树形结构 —— 并查集 —— 基本操作
- 下一篇: 昆虫繁殖(信息学奥赛一本通-T1312)