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