動態規劃 揹包問題

2022-01-15 07:01:24 字數 1334 閱讀 4085

一、01揹包

題目描述:01揹包是在n件物品取出若干件放在空間為w的揹包裡,每件物品的體積為w1,w2……wn,與之相對應的價值為p1,p2……pn。求出獲得最大價值的方案。[注意:每種物品只能拿乙個。]

用二位陣列dp來記錄狀態,其中dp[i][j]表示的是從第一件物品開始向背包裡裝,當揹包最大空間為j且裝到第i件物品時,價值最大是多少。顯然,對於每個物品可以選擇裝或不裝~

遞推方程:

dp[0][j]=0;

dp[i+1][j]=dp[i][j](j

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

=w[i])

例如資料為(w,p)=

根據遞推公式可得下表:

實現**如下:

memset(dp, 0, sizeof(dp));

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

時間複雜度o(nw)

也可以優化成一維陣列,**如下

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

}

例題hdu problem : 2602 ( bone collector )

#include #include #include using namespace std;

const int max = 1005;

int d[max], w[max], p[max];

int main()

return 0;

}

二、完全揹包

與01揹包的區別就是一種物品可以有無數多件。所以對於每種物品,可以選擇放0件,放1件,放n件……在不超過揹包重量的情況下……

遞推公式(複雜度o(nw^2))

dp[0][j]=0;

dp[i][j]=max(dp[i-1][j-k*w[i]]+k*p[i]);(k=0,1,2,...)(j>k*w[i])

通過觀察可發現dp[i][j]可以由dp[i][j-w[i]]推出。從而降低時間複雜度

實現**(時間複雜度o(nw)):

memset(dp, 0, sizeof(dp));

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

}

一維陣列實現

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

}printf("%d\n", dp[w]);

動態規劃 揹包問題

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