揹包(動態規劃)

2022-10-09 03:15:15 字數 1065 閱讀 6183

一、01揹包問題(特點:每件物品僅有一件,可以選擇放與不放)

有件物品和乙個容量為

的揹包。第

件物品的費用是

,價值是

。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。

用子問題定義狀態: f[i][v]=max(f[i-1][v],f[i-1]][v-c[i]]+w[i]);

注意有意義當且僅當存在乙個前i件物品的子集,其費用總和為

。所以按照這個方程遞推完畢後,最終的答案並不一定是

,而是的最大值。如果將狀態的定義中的「恰」字去掉,在轉移方程中就要再加入一項

,這樣就可以保證

就是最後的答案。

1)初始化  memset(f,0,sizeof f)

2)   優化(空間優化)

第一種:滾動陣列優化(當前狀態只與前一狀態有關)

//

f[2][n]

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

}printf(

"%d\n

",f[n%2

][v]);

//滾動陣列只能節約空間複雜度,時間複雜度和原來一樣

第二種:降維優化

//

f[n]

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

}printf(

"%d\n

",f[v]);

3)越界(列舉容量時要求不超過揹包容量,如果超過就意味著揹包裝不下第i個物品)

4)時間複雜度o(n*v) 空間複雜度o(v)

二、完全揹包(特點:與01揹包不同的是物品有無限個)

//

遞推公式計算時,f[i][j] = max,注意這裡當考慮放入乙個物品 i 時應當考慮還可能繼續放入 i,因此這裡是f[i][j-v[i]]+w[i], 而不是f[i-1][j-v[i]]+w[i]。

降維優化後:

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

}printf(

"%d\n

",f[v]);

動態規劃 揹包

揹包經典問題 揹包問題01 乙個揹包容積為t 0 t 2000 現在有n 0 如下 includeusing namespace std int s 1005 bool f 3000 int main 揹包問題02 若每種物品有無限多個。從這n種物品中選取若干個裝入揹包內,使揹包所剩的空間最小。請求...

動態規劃揹包問題 01揹包

問題描述 n種物品,每種乙個。第i種物品的體積為vi,重量為wi。選一些物品裝到容量為c的揹包,使得揹包內物品不超過c的前提下,重量最大。問題分析 宣告乙個f n c 的陣列。f i j 表示把前i件物品都裝到容量為j的揹包所獲得的最大重量。當 j v i 時,揹包容量不足以放下第 i 件物品,f ...

動態規劃揹包問題 完全揹包

問題描述 有n種物品,每種均有無窮多個。第i個物品的體積為vi,重量為wi。選一些物品裝到容量為c的揹包中,使得揹包內物品在總體積不超過c的前提下重量盡量大。問題分析 開乙個陣列f i j 表示前i種物品中選取若干件物品放入剩餘空間為j的揹包中所能得到的最大重量。每種物品無窮個,所以還要有乙個k遍歷...