0-1 揹包問題:給定 n 種物品和乙個容量為 c 的揹包,物品 i 的重量是 wi,其價值為 vi 。
問:應該如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大?
關鍵**就是上面這段;接下來請大家跟著我的思路推下來。10分鐘你就能懂我理解了兩小時的演算法int v[n]=;
int w[n]=;
m[i][j]=};
for(int i=1;i<=n;i++)//i表示可以裝進揹包的數量
}
01揹包最關鍵的地方就在於,他要遍歷所有的情況,然後在你到某個位置的時候,他前面位置已經是所有情況最優的情況了
int v[n]=;
int w[n]=;
首先假設我們的書包容量c是15。
第乙個for:
i=1,j=1,表示可以放1件物品,容量為1,這時候揹包什麼都放不下。m[1][1]=0
i=1,j=2,表示可以放1件物品,容量為2,也放不下
直到i=1,j=8時,可以放入第乙個物品了。
這是第乙個要理解的地方,不是說你揹包容量為2,就能放下標為6的那個2.是要從前面開始逐個遍歷的。相當於你現在i=1,只能解鎖v[1]=8那個物品在你的眼前給你放
最優的就是m[1][8]=m[0][8-8]+4=4.這時候就是代表放一件物品容量為8時的價值為4.
因為i=1.表示現在只能放乙個物品,所以m[1][9]=m[0][9-8]+4=m[0][1]+4=4.這時候m[1][8]–m[1][15]最大價值都是4.
第二個for:
現在解鎖到了v[1]=8,v[2]=10
i=2,j=1,表示可以放1件物品,容量為1,這時候揹包什麼都放不下。m[2][1]=0
也是直到i=2,j=8時。這時候j>=w[i](w[2]=10)不成立,所以進入else,m[2][8]=m[1][8]=4
到i=2,j=10.這時候j==w[2]了。m[2][10]=max(4,m[1][10-10]+10)=max(4,m[1][0]+10)=10
第二個理解的地方。容量為10.裝進去之後你的揹包已經沒容量了。就相當於還能選一件,但是你的揹包已經裝不下了。所以相當於m[1][0]+10。+10是你現在這個物品放進去的價值。和之前的4比,10顯然更大,所以m[2][10]=10
這樣一直到第三個for,解鎖了8,10,6
**##**關鍵點來了。最重要的地方!!
i=3,j=10時。m[3][10]=max(m[2][10],m[2][10-10]+6)=6
i=3,j=14時,m[3][14]=max(m[2][14],m[2][14-6]+2)=6
而裡面的m[2][14]=max(m[1][14],m[2][8]).而這兩個我們上面都推了分別為4,4.m[2][8]+2=4+2=6.
m[3][15]的時候,揹包容量全開。這時候最大還是為6.也就是說三件物品時,最大價值就是6!!
所以能放前三件。最大的價值為6
到最後m[6][15]也就是最後。給你選擇全部的6件物品,容量全開的情況下
m[6][15]=max(m[5][15],m[5][15-2]+1)而算這個for之前,已經算出來前5件的時候最優是9了。跟第六件各種情況max對比一下,就能得出最後結果
最後m[6][15]即為所求。
0 1揹包問題的個人理解
問題 給乙個能承重v的揹包,和n件不同物品 每個物品只有一件 我們用重量和價值的二元組來表示乙個物品,第i件物品表示為 vi,wi 問 在揹包不超重的情況下,得到物品的最大價值是多少?最近做了不少題,不像以前那樣水部落格了2333,總結一下,運用動態規劃解決此類問題,首先確定遞推狀態 f i j k...
01揹包問題的理解
01揹包是 n個物品重量和價值分別為w i v i 揹包可以容納的重量為weight,怎麼裝下最大價值的物品?狀態轉移方程是 value i,w max value i 1,w w i v i value i 1,w 要求w的解,那麼先求w w i 的解,w w i 的值只有在知道了i是多少時才知道...
揹包01問題初理解
揹包問題 knapsack problem 是一種組合優化的np完全問題。問題可以描述為 給定一組物品,每種物品都有自己的重量和 在限定的總重量內,我們如何選擇,才能使得物品的總 最高。問題的名稱 於如何選擇最合適的物品放置於給定揹包中。具體理解可以直接通過下面的例子來理解揹包問題 揹包問題的乙個例...