有乙個體積為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 元。於是,他把每...