DP動態規劃 揹包問題

2022-05-18 22:01:49 字數 1413 閱讀 7851

具體例子:有n個重量和價值分別為wi,vi的物品,從這些物品中挑選出總重量不超過w的物品,求所有挑選方案中價值總和的最大值。例如:

- n = 4

- (w,v) =

- w = 5

dp思想:求出狀態轉移方程,也就是求出遞推式。首先將問題一般化:解決此問題需要2個一維陣列,和1個二維陣列:

w[i]:表示第i個物品的重量,下標從0開始。

v[j]:表示第j個物品的價值

dp[i][j]:從第i個物品開始挑選總重小於j時,總價值的最大值

dp[i+1][j-w[i]]:從第i+1個物品開始挑選總重小於j-w[i]時,總價值的最大值。

於是顯而易見有:

- dp[n][j] = 0,因為第n號物品不存在,只有n-1號物品

- 當j

//此時選擇0,1,3號物品為解:7。

#include

using

namespace

std;

int w[4] = ,v[4] = ;

int n = 4,w = 5;

int dp[5][5]; //dp陣列

void solve()

}

} int main(void)

總結:該方法中需要理解的地方是關於i的迴圈必須是逆向進行的,因為已知dp[n][j] = 0(全域性陣列初始化為0),dp的值需要以此為基礎進行遞推。故要從i = n-1開始迴圈。

令:dp[i][j]: 從前i個物品中選出總重量不超過j的物品時的總價值的最大值。

dp[0][j]: 從前0個物品中選出總重量不超過j的最大值,顯然 = 0.

那麼現在的首要目的就是要求出dp[i+1][j]的遞推表示式,而求dp[i+1][j]又可以分解為:

- 從前i個物品中選出總重量不超過j

- 從前i個物品中選出總重量不超過j-w[i]

在這兩種情況中取最大值。

綜上述可得:

- dp[0][j] = 0,dp[i][0] = 0;

- dp[i+1][j] = dp[i][j] (j < w[i])

- dp[i+1][j] = max(dp[i][j], dp[i][j-w[i]]+v[i])

原始碼如下:

#include 

using

namespace

std;

int w[4] = ,v[4] = ;

int n = 4,w = 5;

int dp[5][5]; //dp陣列

void solve()

}} int main(void)

總結:相比於方法1,這裡改變了i的迴圈方向,需要注意的地方是i要從1開始遍歷。

DP 動態規劃 揹包問題

將乙個容量為v的揹包,物品有兩個屬性,乙個w和乙個v表示體積和屬性值。每種物品只有乙個。要求裝下盡可能多,求最大價值。轉移狀態方程 dp j max dp dp j list i w list i v,dp j 1 include includeusing namespace std struct ...

動態規劃(DP)揹包問題

dp做題的步驟 1.確定狀態變數 dp i dp i j 的含義 2.確定狀態轉移方程 3.確定邊界條件 4.確定遞推順序 題目1 01揹包 有n個重量和價值分別為w和v的物品。從這些物品中挑選總重量不超過w的物品。求所有挑選方案中價值總和的最大值 思路 dp i 1 j 表示從前i個物品中選出總重...

動態規劃 揹包問題(DP系列)

一 問題描述 有n 個物品,它們有各自的重量和價值,現有給定容量的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?二 總體思路 根據動態規劃解題步驟 問題抽象化 建立模型 尋找約束條件 判斷是否滿足最優性原理 找大問題與小問題的遞推關係式 填表 尋找解組成 找出01揹包問題的最優解以及解組成,然後編...