01揹包的兩種初始化問題

2021-08-04 06:48:40 字數 2300 閱讀 7010

前段時間看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 ...