前段時間看dp中的01揹包問題,大部分內容都好理解,網上也有很多關於這個問題的部落格,但自己提出的問題沒有得到解決,只好苦思冥想,以求進一步理解。
首先是問題描述:給定n種物品和一揹包,物品i的重量是wi,
其價值是pi,揹包的容量是m,問如何選
擇裝入揹包中的物品
總價值最大?
這裡有兩種情況一種是將揹包恰好裝滿,一種是不要求恰好裝滿。解決這樣的問題的方式就是通過設定初始化來解決。
01揹包詳細內容不再嘮叨了,大家看看現在主要就上述兩
種情況來說明。
當要求恰好裝滿時,初始化f[0,0]=0
f[0,1]=f[0,2]=.......=f[0,n]=-∞
當不要求恰好裝滿,初始化f[0,0]=f[0,1]=.......=f[0,n]=0 說明:
這裡的負無窮可以理解為沒有方案可以滿足要求。
首先明白一點:動態規劃的過程中總是將乙個比較大的問題分解成子問題來解決,
這個子問題與該較大問題
具有共同的性質。
f[i,v]
是說從前i個物品中挑出物品,將他們放入體積為v的揹包可以獲得的最大價值。f[0,1....n]
可以看做是從前0個物品中挑選,放入體
積分別為0,1,.....,n的揹包。f[0,1...n]可以看做是最簡化的01揹包問題了。
它也是許多較大問題的最初的子問題。
先來看恰好裝滿的情形:舉個例子f[0,4]表示從前0個物品中挑選(沒有物品可以選擇)放入體積為4的揹包,
如果要求恰好裝滿,
智商只要
>0都知道不可能放滿,所
以f[0,4]=-∞,那麼同理可見f[0,1...n]都沒有辦法滿足恰好放
滿的要求,它們的值都為-∞。只有f[0,0]與
它們不同,
前0個物品放入體積為0的
揹包,恰好滿足
放滿的要求。包裡
是空的,其物品價值=0,即f[0,0]=0。
再來看不要求放滿的情形:在這種要求下無論揹包的體積是0到n的哪乙個個,從前0個物品中選出放入體積
為0....n的揹包,它們都
有方案可以滿足情形的要求,也就是在不放入任何物品。此時包裡沒有物品它們的價值即f
[0,0....n]初始化為0即可。
再來從底向上看初始化的值是如何作用於較大規模的問題:
假設有乙個體積為10的揹包,物品的體積分別為4、5、6,對應的價值為10,17,16 。
由01揹包的狀態轉移方程f[i,v]=max
可知計算f[3,10]需要知道f[2,10]與f[2,4]這兩個子問題,每個子問題又需要計算更小的的子問題,這裡做了下圖以供說明:
注意:這裡出現了f[1,-1]它是完全不可能的一種情況,因為包的大小不可能為-1。
如果要求恰好裝滿揹包,顯然f[3,10]=10+16=26,也就是選擇體積為4與6的物品為價值最高且滿足題意的選
擇。那麼從01揹包的算
法如何得到正確的選擇?由演算法的過程可知要求f
[3,10]需要求的子問題如上圖所示。01背
包演算法從底向上計算,這裡恰好裝滿揹包則
初始化f[0,0]=0,f[0,1...10]=-∞,即最下面的一排除了f[0,0]+10,其他幾
個子問題值都為-∞。由此依次往上計算,最終可知只有從f[0,0]
+10
f[1,4] f[2,4]+17 f[3,10] 這樣的一條
路徑可以得
到想要的結果,其他幾條路徑下f[3,10]=-∞即不能恰好裝滿。在滿足題意
的這條路
徑上可以看出選擇
了體積為4和6的物品,價值為26。
如果要求不需恰好裝滿,f[0,0...n]=0,最下一排都有自己的值(不為-∞),從底向上計算可知在恰好裝滿背
包中選出的路徑得到
的結果不是
最大值,而是從f[0,1]+10開始的路徑得到最大的值27。
最後乙個問題:本來要解決的是恰好裝滿揹包與不需恰好裝滿揹包的問題,如何聯想到通過賦初值從而
簡單巧妙的解決的這
個問題?
乙個思路是將揹包問題的規模從大化小,考慮最簡單的揹包問題f[1,10]與考慮f[10000,1000000]是同樣思路,那
麼在遇到f[i,v]的
問題時是否可以考慮從f[0,1],f[0,2]等等這樣的問題來考慮。裝滿與不需裝滿揹包就可以將問題看
做將前0個物品放入容量為v的背
包這樣的
簡單問題處理。
總結就到這裡,歡迎各位看官批評指正。
01揹包初始化要點
我們看到的求最優解的揹包問題題目中,事實上有兩種不太相同的問法。有的題目要求 恰好裝滿揹包 時的最優解,有的題目則並沒有要求必須把揹包裝滿。一種區別這兩種問法的實現方法是在初始化的時候有所不同。如果是第一種問法,要求恰好裝滿揹包,那麼在初始化時除了f 0 為0其它f 1.v 均設為 這樣就可以保證最...
揹包問題 初始化
初始化的細節問題 我們看到的求最優解的揹包問題題目中,事實上有兩種不太相同的問法。有的題目要求 恰好裝滿揹包 時的最優解,有的題目則並沒有要求必須把揹包裝滿。一種區別這兩種問法的實現方法是在初始化的時候有所不同。如果是第一種問法,要求恰好裝滿揹包,那麼在初始化時除了f 0 為0,其它f 1 v 均設...
關於0 1揹包初始化的理解
下面是本蒟蒻的一些個人理解,請見諒 眾所周知,01揹包有兩種初始化形式 初始化為0,f j f j f j 表示不要求裝滿時揹包容積為j jj的最大價值 f 0 f 0 f 0 初始化為0,f 1 n f 1 n f 1 n 初始化為 infty f j f j f j 表示恰好裝滿時揹包容積為j ...