揹包問題 動態規劃

2021-08-20 19:51:51 字數 2070 閱讀 2411

有乙個體積為v的揹包,有n個物品,每個物品都有體積vi和價值wi,在揹包體積範圍內,求能桌下的最大價值。

這個問題中每個物品只能用一次。

設dp[i][j]表示用前i個物品裝體積為j的揹包。

那麼第i個物品要麼裝要麼不裝:

1、如果不裝,第i個物品和沒有一樣,dp[i][j]=dp[i-1][j]

2、如果裝,等於dp[i-1[j]中刨除第i個物體體積此時的最大價值 加上 第i個物體的價值。dp[i][j]=dp[i-1][j-v[i]]+w[i];

我們只需取這兩種方案的最大值,就算是解決了。dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[i]]+w[i]);

時間複雜度是o(v*m),空間也是o(v*m)

其實空間可以優化

注意觀察,可以發現每個狀態dp[i][j]之和dp[i-1]有關,什麼i-2,i-3都沒用了

我們試著開乙個一維的陣列dp[m];

一維難道不會覆蓋掉原來的值麼?

會的,但我們優先覆蓋不用的值。怎麼說呢?就是我們每次只會用比j小的地方的值,比j大的地方是不用到的,所以我們只要j從後往前列舉,就不會衝突了。

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

具體來看看**:

for(int i=1;i<=n;i++)

for(int j=v;j>=v[i];j--)

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

自寫** 二維記憶陣列

#include #include#define max_n 10001

#define max_m 1001

using namespace std;

int w[max_n],v[max_n];

int dp[max_n + 1][max_m+ + 1]; //dp[i][j] 前i-1個物體中挑選重量不超過j時的最大價值

//其中,dp[0][j]=0;

//特徵方程 dp[i][j] = dp[i-1][j]; j>n>>w;

if(n < 1 || n > 10000 || w < 1 || w > 1000)

return 0;

for(int i = 1; i <= n; i++)

for(int i = 1; i <= n; i++)

}cout<

完全揹包就是每種物品有無限個的揹包

這個時候我們的狀態轉移方程可以這麼寫:dp[i][j]=max(dp[i-1][j],dp[i][j-v[i]]+w[i]);

看起來好像沒區別啊?!

真的麼?

仔細看看,i-1變成了i

也就是說,選擇了第i個物品後,並不是轉到i-1,因為每個物品有無限個,所以還是轉到了i

狀壓一下,就是

dp[j]=max(dp[j],dp[j-v[i]]+w[i])  【j=v[i]->n】

唯一的區別就是j列舉的方向反了過來

for(int i=1;i<=n;i++)

for(int j=v[i];j<=m;j++)

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

自寫**  二維記憶陣列

#include #include#define max_n 10001

#define max_m 1001

using namespace std;

int w[max_n],v[max_n];

int dp[max_n + 1][max_m+ + 1];//dp[i][j] 前i-1種物體中挑選重量不超過j時的最大價值

//其中,dp[0][j]=0;

//特徵方程 dp[i][j] = dp[i-1][j]; j>n>>w;

if(n < 1 || n > 10000 || w < 1 || w > 1000)

return 0;

for(int i = 1; i <= n; i++)

for(int i = 1; i <= n; i++)

}cout<

動態規劃 揹包問題

給定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 元。於是,他把每...