看懂0 1揹包與完全揹包的空間優化

2021-08-20 03:53:30 字數 1515 閱讀 9519

0/1揹包的主要思路就是:這件物品,取還是不取。用乙個二維陣列dp[i][v]來表示對第i個物品,揹包容量為v時的情況。c[i]表示第i件物品的體積,w[i]表示第i件物品的價值。那麼考慮第i件物品取與不取:如果不取,那麼就可以轉化為i-1件物品、容量仍然為v、價值沒有增加的情況(dp[i-1][v]);如果取,那麼轉化為i-1件物品、容量減去第i件物品的體積後剩餘容量、價值加上第i件物品的價值後的情況(dp[i-1][ v-c[i] ] + w[i] )。為了讓揹包中物品價值最大,我們取二者較大者,也就是

dp[i][v]=max。好了,現在思考如何將陣列壓縮,對於這兩種情況下dp[i][v]值的改變,要麼是dp[i][v]=dp[i-1][v],要麼是dp[i][v]=dp[i-1][ v-c[i] ] + w[i]。假設下面是就是二維陣列dp的一部分,ab

dp[i-1][v]

d    e

f    g

dp[i][v]

h          k

我們可以發現:如果dp[i][v]=dp[i-1][v],那麼相當於直接複製dp[i][v]上面的元素dp[i-1][v]值。而如果dp[i][v]=dp[i-1][ v-c[i] ] + w[i],注意到,v-c[i]<=v,所以,dp[i][v]的值是由上面紅色的元素加上w[i]得到,也就是說,我們每次想要更新dp[i][v],可能會用到的值只有上面紅色的部分,所以,我們就能把二維陣列壓縮為一維陣列,只需要每次從後往前更新dp[i][v]的值。這樣就用dp[v]來表示容量為v的情況下,揹包內物品的價值,狀態轉移方程也就成了:

dp[v]=max

對於完全揹包,一件物品可以取多次,我們仍然使用0/1揹包的思想:這件物品,取還是不取。唯一的變化是,取了這件物品,還可以取。所以,如果取,仍然是i件物品的問題( dp[i][ v - c[i]] + w[i]);如果不取,dp[i][v]還是dp[i-1][v]都一樣(第一次不取,以後也不會取,相當於轉化成i-1件物品的問題,為了和取的情況保持一致,採用dp[i][v])。所以狀態轉移方程變為了dp[i][v]=max,那麼在陣列裡,

a    b    m        d    e

f    g     dp[i][v]       h          k

同樣注意到,v-c[i]<=v,所以,每次更新dp[i][v],可能用到的值是紅色部分,所以也可以壓縮為一維,這裡要注意了,陣列中的f、g,是i下的情況,並不是i-1的情況,dp[i][v]的值取決取i下,而不是i-1,所以此時應該從前往後更新dp的值,這樣才能保證取第i件物品時,dp[i][v]是由dp[i][v-c[i]]+w[i]推得,所以儘管狀態轉移方程仍然為dp[v]=max,v的迴圈順序卻應該是從小到大。

基本上,這就是0/1揹包和完全揹包從二維轉化為一維的思路,以後自己還要經常複習。

0/1揹包的偽**:

for i=1 to n

for v=v to 0

f[v]=max

完全揹包的偽**:

for i=1 to n

for v=0 to v

f[v]=max

0 1揹包與完全揹包

現有 n 件物品,乙個最大容量為 w 的揹包。第 i 件物品重量為 wi 價值為 vi 已知對於一件物品,你必須選擇取或不取,且每件物品只能被取一次 這就是 0 1 的含義 求放置哪幾件物品進揹包,使得揹包中物品價值最大 或是求最大價值是多少等衍生問題 設 ans n,w 為當揹包容重量為 w 有 ...

揹包問題 01揹包與完全揹包

一 介紹 揹包問題是最廣為人知的動態規劃問題,都是給定限定的揹包容量與物品,求所能裝下的最大價值 完全揹包 有n種物品,每種均有無限多,第i種物品額體積為v i 重量 價值 為w i 01揹包 有n種物品,每種只有乙個,第i種物品額體積為v i 重量 價值 為w i 在揹包問題中,我們把不同種的物品...

01揹包,完全揹包

動態規劃 動態規劃的核心是狀態以及狀態轉移方程。需要定義乙個 i,j 狀態以及該狀態的指標函式d i,j 01揹包 有n種物品,每種只有乙個,第i件物品的體積為vi質量為wi。選一些物品裝到體積為c的揹包中,使其體積不超過c的前提下重量最大。namevw abcd e 子問題定義 dp i j 表示...