動態規劃之0-1揹包(2)

解決思路的基本過程:

問題的特點是:每種物品一件,可以選擇放1或不放0

用子問題定義狀態:即f[i][v]表示前i件物品恰放入一個容量爲v的揹包可以獲得的最大價值。則其狀態轉移方程便是:


f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}


這個方程非常重要,據說基本上所有跟揹包相關的問題的方程都是由它衍生出來的。所以詳細的查了一下這個方程的含義:將前i件物品放入容量爲v的揹包中這個子問題,若只考慮第i件物品的策略(放或不放),那麼就可以轉化爲一個只牽扯前i-1件物品的問題。如果不放第i件物品,那麼問題就轉化爲i-1件物品放入容量爲v的揹包中,價值爲f[i-1][v];如果放第i件物品,那麼問題就轉化爲i-1件物品放入剩下的容量爲v-c[i]的揹包中,此時能獲得的最大價值就是f[i-1][v-c[i]]再加上通過放入第i件物品獲得的價值w[i]

在有的地方看到的揹包問題題目中,有兩種不太相同的問法。有的題目要求恰好裝滿揹包時的最優解,有的題目則並沒有要求必須把揹包裝滿。一種區別這兩種問法的實現方法是在初始化的時候有所不同。

如果是第一種問法,要求恰好裝滿揹包,那麼在初始化時除了f[0]0其它f[1..V]均設爲-∞,這樣就可以保證最終得到的f[N]是一種恰好裝滿揹包的最優解。

如果並沒有要求必須把揹包裝滿,而是隻希望價格儘量大,初始化時應該將f[0..V]全部設爲0

爲什麼呢?可以這樣理解:初始化的f數組事實上就是在沒有任何物品可以放入揹包時的合法狀態。如果要求揹包恰好裝滿,那麼此時只有容量爲0的揹包可能被價值爲0nothing“恰好裝滿,其它容量的揹包均沒有合法的解,屬於未定義的狀態,它們的值就都應該是-∞了。如果揹包並非必須被裝滿,那麼任何容量的揹包都有一個合法解什麼都不裝,這個解的價值爲0,所以初始時狀態的值也就全部爲0了。


小結

01揹包問題是最基本的揹包問題,它包含了揹包問題中設計狀態、方程的最基本思想,另外,別的類型的揹包問題往往也可以轉換成01揹包問題求解。故仔細體會上面基本思路的得出方法,狀態轉移方程的意



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章