动态规划 —— 背包问题 P07 —— 有依赖背包
【簡化的問題】
這種背包問題的物品間存在某種“依賴”的關系,也就是說,i依賴于j,表示若選物品i,則必須選物品j。
為了簡化起見,我們先設沒有某個物品既依賴于別的物品,又被別的物品所依賴,另外,沒有某件物品同時依賴多件物品。
【算法】
將不依賴于別的物品的物品稱為“主件”,依賴于某主件的物品稱為“附件”,所有的物品由若干主件和依賴于每個主件的一個附件集合組成。
按照背包問題的一般思路,僅考慮一個主件和它的附件集合。可是,可用的策略非常多,包括:一個也不選,僅選擇主件,選擇主件后再選擇一個附件,選擇主件后再選擇兩個附件……無法用狀態(tài)轉移方程來表示如此多的策略。(事實上,設有n個附件,則策略有2^n+1個,為指數級。)
考慮到所有這些策略都是互斥的(也就是說,你只能選擇一種策略),所以一個主件和它的附件集合實際上對應于P06中的一個物品組,每個選擇了主件又選擇了若干個附件的策略對應于這個物品組中的一個物品,其體積和價值都是這個策略中的物品的值的和。但僅僅是這一步轉化并不能給出一個好的算法,因為物品組中的物品還是像原問題的策略一樣多。
考慮P06: 可以對每組中的物品應用P02中“一個簡單有效的優(yōu)化”。?
這提示我們,對于一個物品組中的物品,所有體積相同的物品只留一個價值最大的,不影響結果。所以,我們可以對主件i的“附件集合”先進行一次01背包,得到體積依次為0..V-w[i]所有這些值時相應的最大價值f'[0..V-w[i]]。那么這個主件及它的附件集合相當于V-w[i]+1個物品的物品組,其中體積為w[i]+k的物品的價值為f'[k]+c[i]。
也就是說原來指數級的策略中有很多策略都是冗余的,通過一次01背包后,將主件i轉化為V-w[i]+1個物品的物品組,就可以直接應用P06的算法解決問題了。
【較一般的問題】
更一般的問題是:依賴關系以圖論中“森林”(即多叉樹的集合)的形式給出,也就是說,主件的附件仍然可以具有自己的附件集合,限制只是每個物品最多只依賴于一個物品(只有一個主件)且不出現循環(huán)依賴。
解決這個問題仍然可以用將每個主件及其附件集合轉化為物品組的方式。唯一不同的是,由于附件可能還有附件,就不能將每個附件都看作一個一般的01背包中的物品了。若這個附件也有附件集合,則它必定要被先轉化為物品組,然后用分組的背包問題解出主件及其附件集合所對應的附件組中各個費用的附件所對應的價值。
事實上,這是一種樹形DP,其特點是每個父節(jié)點都需要對它的各個兒子的屬性進行一次DP以求得自己的相關屬性。
這已經觸及到了“泛化物品”的思想,看完P08后,你會發(fā)現這個“依賴關系樹”每一個子樹都等價于一件泛化物品,求某節(jié)點為根的子樹對應的泛化物品相當于求其所有兒子的對應的泛化物品之和。
新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的动态规划 —— 背包问题 P07 —— 有依赖背包的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 单词接龙(信息学奥赛一本通-T1220)
- 下一篇: 拦截导弹问题(信息学奥赛一本通-T132