揹包問題(1)-------01揹包

首先,我也是才曉得01揹包,之前以爲是個比較高升的問題,可是如今就感受還好,難度較小,理解起來比較容易,是揹包問題中最簡單的問題,多說無益,先來看一看,01揹包的概念優化

01揹包是在M件物品取出若干件放在空間爲W的揹包裏,每件物品的體積爲W1,W2至Wn,與之相對應的價值爲P1,P2至Pn。01揹包是揹包問題中最簡單的問題。01揹包的約束條件是給定幾種物品,每種物品有且只有一個,而且有權值和體積兩個屬性。在01揹包問題中,由於每種物品只有一個,對於每一個物品只須要考慮選與不選兩種狀況。若是不選擇將其放入揹包中,則不須要處理。若是選擇將其放入揹包中,因爲不清楚以前放入的物品佔據了多大的空間,須要枚舉將這個物品放入揹包後可能佔據揹包空間的全部狀況,時間較慢,因此很少用。spa

01揹包題目的雛形是:設計

有N件物品和一個容量爲V的揹包。第i件物品的體積是c[i],價值是w[i]。求解將哪些物品裝入揹包可以使價值總和最大。code

從這個題目中能夠看出,01揹包的特色就是:每種物品僅有一件,能夠選擇放或不放。
其狀態轉移方程是:
f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}
對於這方方程其實並不難理解,方程之中,如今須要放置的是第i件物品,這件物品的體積是c[i],價值是w[i],所以f[i-1][v]表明的就是不將這件物品放入揹包,而f[i-1][v-c[i]]+w[i]則是表明將第i件放入揹包以後的總價值,比較二者的價值,得出最大的價值存入如今的揹包之中。
理解了這個方程後,將方程代入實際題目的應用之中,可得
for (i = 1; i <= n; i++)
    for (j = v; j >= c[i]; j--)//循環嵌套,保證裝滿爲止
        f[i][j] = max(f[i - 1][j], f[i - 1][j - c[i]] + w[i]);

可是這個的時間複雜度較大,因此要優化。今天就不說了。blog

總結一下class

01揹包問題是最基本的揹包問題,它包含了揹包問題中設計狀態、方程的最基本思想,另外,別的類型的揹包問題每每也能夠轉換成01揹包問題求解。故必定要仔細體會上面基本思路的得出方法,狀態轉移方程的意義,以及最後怎樣優化的空間複雜度。循環

相關文章
相關標籤/搜索