對於背包問題,林喵喵推薦我看了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] }
題目描述:
有編號分別為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