動態規劃之01揹包問題

2021-08-13 03:20:59 字數 1979 閱讀 6039

最近刷leetcode時遇見了好幾道動態規劃,因此對如何解動態規劃這類題目也稍有心得。

可能大家都知道官方的具體解釋,巴拉巴拉一堆解釋。而在我看來,動態規劃就是一種對於問題的拆分。將乙個問題拆分成乙個乙個子問題,總問題的解決辦法就依靠著這些子問題的解決而解決。好比你爬上10層樓,你需要先解決1樓到2樓,2樓到3樓。。。。。。最後9樓到10樓。

問題描述:

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

對於此類典型的揹包問題,我們可以將此問題進行細分:

1.首先將物品細分,問題就可以變為這樣:

有編號分別為a的五件物品,它們的重量分別是2它們的價值分別是6現在給你個承重為10的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?

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

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

2.對於重量我們也可以進行細分。

最後細分成的問題就是:有編號分別為1,2,..,i的i件物品,它們的重量分別是w1,w2..,wi它們的價值分別是v1,v2,,,vi現在給你個承重為j的揹包,如何讓揹包裡裝入的物品具有最大的價值總和,總價和使用dp[i][j]表示?

問題細分到這裡,大家也就知道那個常見的所謂狀態轉移方程是如何來的了。

dp[i][j] = max(背上i包後的最大價值,不背i包的最大價值)

不背i包的最大價值 = dp[i-1][j],相信大家都能理解。

背上i包的價值=dp[i-1][j-wi]+vi。解釋一下:假設此時揹包的容量j=5,i包的重量為wi=2,那麼你需要知道揹包容量j』=5-2時,不背i包時的最大價值也就是dp[i-1][j-wi],然後在這種情況下背上i包,此時最大價值也就是dp[i-1][j-wi]+vi,也就是背上i包的最大價值。

所以狀態轉移方程就是dp[i][j] =max(dp[i-1][j-wi]+vi, dp[i-1][j]),當然需要j>=wi,如果j小於wi,說明i包超過了揹包最大容量了,因此此時最大價值dp[i][j] = dp[i-1][j])。

搞清楚了狀態轉移方程如何來的,我們就可以解決問題了。

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

偽碼如下:

int dp = new int[包數量+1][總容量加1];

for(int i=0;i<=包數量;i++)

dp[i][0] = 0;

for(int

j=0;j<=總容量加;j++)

dp[0][j] = 0;

for(int

i=1;i<=包數量;i++)

因此揹包最大價值 :dp[5][10]=15

動態規劃之01揹包問題

首先是問題描述 給定n種物品和一揹包,物品i的重量是wi,其價值是pi,揹包的容量是m,問如何選擇裝入揹包中的物品總價值最大?可以這樣理解 揹包的揹負有上限,因此在這個上限內盡可能多的裝東西,並且價值越多越好。在這裡我之想討論動態規劃解決這個問題的詳細過程。動態規劃是用空間換時間的一種方法的抽象。其...

動態規劃之0 1揹包問題

問題描述 現有n件物品和乙個容量為c的揹包。第i件物品的重量是重量為w i 價值是v i 已知對於一件物品必須選擇取 用1表示 或者不取 用0表示 且每件物品只能被取一次 這就是 0 1 的含義 求放置哪些物品進揹包,可使這些物品的重量總和不超過揹包容量,且價值總和最大。求解思路 0 1揹包問題的遞...

動態規劃之0 1揹包問題

問題描述 0 1揹包問題是應用動態規劃設計求解的典型例題 已知n種物品和乙個可容納c重量的揹包,物品i的重量為w i 產生的效益為p i 在裝包時物品i可以裝入,也可以不裝,但不可拆開裝。問如何裝包,所得裝包總效益最大。演算法分析 最優子結構特性 0 1揹包的最優解具有最優子結構特性。與一般揹包問題...