1. 程式人生 > >動態規劃——學習過程之01揹包

動態規劃——學習過程之01揹包

首先是揹包問題:

1、01揹包

 

要想計算某一條路徑的值的和的最大值,就需要對每一個節點處的不同值進行分析,取大舍小,然後相加,簡單地來說就是加與不加。

在01揹包問題中,也只有兩種選擇方式,放或者不放。

下面我就先給一個公式:f(i,v)=max{f(i-1,v),f(i-1,v-weight[i])+w[i]}

在這個式子中,前面的一部分代表不放,那麼我就可以說是 前i-1個物體在容量為v的情況下面的最大值。

後面的一部分代表放進去,那麼我就可以說是前i-1個物體在容量為(v-weight[i])的情況下的價值+物體i的價值。

如果說物體數量為N,體積為V的情況下,時間、空間複雜度就是O(N*V)

既然出現了i-1那麼在開始計算的時候,資料應該是從第0個物體開始計算的。

 

下面我舉一個例子來說明:

揹包容量為5,現在有四組資料,分別為(2,3),(1,2),(3,4),(2,2)前一個數代表所佔容量,後面的一個數代表價值,現在想要在現有的容量範圍內找到放置物品的最合理的方法使得揹包內物品的價值最大,你該怎麼算?

開始學的時候我不自覺地想到了貪心演算法,一個是區域性最優解一個是整體最優解

http://www.cnblogs.com/Jinghe-Zhang/p/8986689.html

來源:https://wenku.baidu.com/view/122c6de402768e9951e738bd.html

 

四行代表四個輸入的資料,從0開始,然後是1(代表第一個物品(2,3)),當揹包體積為2的時候,價值為3,後面的價值就都是3了。

然後.以此類推..........

那麼問題也就來了,.前面說的放與不放在哪裡呢?

現在我把這一塊拿出來,對於第二行的3>2,2是前一個的2,對於5>3,3是f(i-1,v),也就是上一行的那一個數字,可是為什麼3變成5了呢?因為5>3對應的縱軸下標為3,前兩個物體的體積加起來是3,也就是f(i-1,j-weight)+va[i];