動態規劃 揹包問題

2021-08-17 21:19:05 字數 2991 閱讀 1520

1、01揹包問題

將質量為wi、價值為vi的n種物品,每種物品只有乙個,放入最大承重為m的揹包中,求揹包所能得到的最大價值。

動態轉移方程:f[i][j]=max(f[i-1][j],f[i-1][j-wi]+vi);

f[i][j]的含義是從前i種物品中取物品放入最大承重為j的揹包中,所能得到的最大價值。

它等於下述兩種情況的最大值:

1、忽略第i種物品,從前i-1種物品中取物品放入最大承重為j的揹包中,所能得到的最大價值。

2、直接將第i種物品放入揹包中,從前i-1種物品中取物品放入最大承重為j-wi的揹包中,所能得到的最大價值。

時間複雜度為o(n*m)

**如下:

#include

#include

int num,m;

int v[100],w[100];

int dp[100][100];

void solve();

using namespace std;

int main()

for(i=0;i上述為揹包承重小於等於m時所得到的最大價值。

當要求揹包承重恰為m時,揹包所能得到的最大價值,此時除了將dp[0][i]和dp[i][0]初始化為0外,還需將剩餘dp初始化為負無窮。當dp[i][j]為負無窮時,表示無解。

空間優化:可將dp[i][j]二維陣列優化為一維陣列。時間複雜度為o(n*m)

for(i=0;ifor(j=n;j>0;j--)

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

實際**:

2、完全揹包問題

將質量為wi、價值為vi的n種物品,每種物品有無限多件,放入最大承重為m的揹包中,求揹包所能得到的最大價值。

動態轉移方程:f[i][j]=max(max(f[i-1][j-k*w[i]]+k*v[i]|   0<=k*w[i]<=j);

狀態數為n*m個,但求解每個狀態的時間複雜度不再為常數,而是為o(j/w[i]),所以時間複雜度高於o(n*m);

空間優化一維陣列。

狀態轉移方程:

for(i=0;ifor(j=1;j<=m;j++)

f[j]=max(f[j],f[j-w[j]]+v[j]);複雜度o(num*n)

3、多重揹包問題

將質量為wi、價值為vi的n種物品,每種物品有ci件,放入最大承重為m的揹包中,求揹包所能得到的最大價值。

類似完全揹包問題:

二維狀態轉移方程:f[i][j]=max(f[i-1][j-k*mi]+k*vi| 0<=k<=ci);

複雜度:o(j*(c1+c2+...+cn))

時間複雜度優化:可通過將第i種物品的ci件進行劃分,化分為1,2,4,8,...,2^(k-1),ci-2^k+1,且k是滿足n[i]-2^k+1>0的最大整數。此時將複雜度變為o(j*(log c1 + log c2 +log c3... +log cn))。

四、混合三種揹包問題

for(i =0;iif(ni為01揹包問題)else if(ni為完全揹包問題)else if (ni為部分揹包問題)//不是最優解 可採用o(j*(log c1 + log c2 +log c3... +log cn))}}

動態規劃 揹包問題

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