01揹包問題 個人最容易的理解,童叟無欺!

2021-09-27 03:49:09 字數 1738 閱讀 7095

0-1 揹包問題:給定 n 種物品和乙個容量為 c 的揹包,物品 i 的重量是 wi,其價值為 vi 。

問:應該如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大?

int v[n]=;

int w[n]=;

m[i][j]=};

for(int i=1;i<=n;i++)//i表示可以裝進揹包的數量

}

關鍵**就是上面這段;接下來請大家跟著我的思路推下來。10分鐘你就能懂我理解了兩小時的演算法

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完全問題。問題可以描述為 給定一組物品,每種物品都有自己的重量和 在限定的總重量內,我們如何選擇,才能使得物品的總 最高。問題的名稱 於如何選擇最合適的物品放置於給定揹包中。具體理解可以直接通過下面的例子來理解揹包問題 揹包問題的乙個例...