01背包問題的詳細概述


對於背包問題,林喵喵推薦我看了dd大佬的背包九講,在此附上鏈接:http://blog.csdn.net/pi9nc/article/details/8142876

網上應該有下載的版本:https://wenku.baidu.com/view/7c1ed28dbd64783e08122b65.html

然后花了一個晚上和一個上午的時間,終於對最簡單的01背包問題有了一點點自己的理解,在此進行一些自己的解釋。

01背包的狀態轉換方程 f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ),  f[i-1,j] }

f[i,j]表示在前i件物品中選擇若干件放在承重為 j 的背包中,可以取得的最大價值。
Pi表示第i件物品的價值。
決策:為了背包中物品總價值最大化,(如果第i件物品放得下的話)第 i件物品應該放入背包中嗎 ?(當然,如果放不下,那就只能選擇不放了)

題目描述:

有編號分別為a,b,c,d,e的五件物品,它們的重量分別是2,2,6,5,4,它們的價值分別是6,3,5,4,6,現在給你個承重為10的背包,如何讓背包里裝入的物品具有最大的價值總和?

 

name weight value 1 2 3 4 5 6 7 8 9 10
a 2 6 0 6 6 9 9 12 12 15 15 15
b 2 3 0 3 3 6 6 9 9 9 10 11
c 6 5 0 0 0 6 6 6 6 6 10 11
d 5 4 0 0 0 6 6 6 6 6 10 10
e 4 6 0 0 0 6 6 6 6 6 6 6

 

只要你能通過找規律手工填寫出上面這張表就算理解了01背包的動態規划算法。(如果是第一次學01背包,請務嘗試必手寫這張表)

首先要明確這張表是至底向上,從左到右生成的。

為了敘述方便,用e2單元格表示e行2列的單元格,這個單元格的意義是用來表示只有物品e時,有個承重為2的背包,那么這個背包的最大價值是0,因為e物品的重量是4,背包裝不了。

對於d2單元格,表示只有物品e,d時,承重為2的背包,所能裝入的最大價值,仍然是0,因為物品e,d都不是這個背包能裝的。(這個就是在循環中的一個判斷(if(v[i]<=j)))

同理,c2=0,b2=3,a2=6。

對於承重為8的背包,a8=15,是怎么得出的呢?

根據01背包的狀態轉換方程,需要考察兩個值,

一個是f[i-1,j],(就是在這個物品放得下的前提下,我們不放這個物品,可以理解為,這個物品占空間位置大,且價值小)對於這個例子來說就是b8的值9,另一個是f[i-1,j-Wi]+Pi(表示我要把這個物品放入背包,那就是為這個物品騰出空間,然后看在j-wi的空間下,放I-1件物品的時候,最大的價值是多少,把那個最大+wj)

在這里,

 f[i-1,j]表示我有一個承重為8的背包,當只有物品b,c,d,e四件可選時,這個背包能裝入的最大價值

f[i-1,j-Wi]表示我有一個承重為6的背包(等於當前背包承重減去物品a的重量),當只有物品b,c,d,e四件可選時,這個背包能裝入的最大價值

f[i-1,j-Wi]就是指單元格b6,值為9,Pi指的是a物品的價值,即6

由於f[i-1,j-Wi]+Pi = 9 + 6 = 15 大於f[i-1,j] = 9,所以物品a應該放入承重為8的背包。

大概就是這樣,如果有什么問題,我今后再補充。

文章參考:http://blog.csdn.net/mu399/article/details/7722810


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM