動態規劃 揹包問題)

2022-05-18 22:01:49 字數 1047 閱讀 4160

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

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]時,總價值的最大值。

於是顯而易見有:

原始碼如下:

//此時選擇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]又可以分解為:

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

綜上述可得:

原始碼如下:

#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,方法2應該更容易理解,這裡改變了i的迴圈方向,。

動態規劃 揹包問題

給定n個物品,重量是,價值是,包的容量 承重 是w 問,放入哪些物品能使得包內價值最大 1 需要將問題轉化為子問題,通過遞迴實現,且子問題必然與父問題存在關聯 2 定義v i,j 表示為,當item取自前i個items且揹包capacity j 時,揹包問題的最優解,也即最高的價值。3 從前i個it...

動態規劃 揹包問題

不廢話,直接上 動態規劃,揹包問題。輸入為 int n 物品的種類數。int n weight 各件物品的重量。int n value 各種物品的價值。int w 揹包最大的裝載重量。輸出 v n b 的值,最大的裝載價值。x n 各類物品的裝載數量。author huangyongye publi...

動態規劃 揹包問題

1 開心的金明 問題描述 金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n 元錢就行 今天一早金明就開始做預算,但是他想買的東西太多了,肯定會超過媽媽限定的n 元。於是,他把每...