完全揹包問題 動態規劃

2022-09-19 11:57:15 字數 1181 閱讀 6299

問題描述:

有 n 種物品和乙個容量是 v 的揹包,每種物品都有無限件可用。

第 i 種物品的體積是 vi,價值是 wi。

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

輸出最大價值。

動態規劃解法:

設f[i][j]表示只看前i個物品,總體積是j的情況下,總價值是多少(與0~1揹包表示意義一樣)。先做出如下推導:

在計算狀態i,j的值f[i][j]時,即在體積不超過j的情況下選擇第i件物品時,除了要考慮前一狀態f[i-1][j](在j的情況下只考慮前i-1件物品)外,還要考慮放置1件i物品、放置2件i物品·····放置k件i物品、直至放滿為止這一類大情況。故結果有:

f[i][j] = max(f[i-1][j], f[i-1][j-v] + w, ····, f[i-1][j-kv] + kw)1

據此另外可以推得如下:

f[i][j-v] = max(f[i-1][j-v], f[i-1][j-2v] + w, ····, f[i-1][j-(k+1)v] + kw)2

仔細觀察1、2式可得,1中max內的右半部分比2式多出乙個w,故可用2式+w來代替。即f[i][j] = max(f[i-1][j], f[i][j-v] + w);

**示例:

#includeusing namespace std;

const int n = 1010;

int f[n][n], n, m, v[n], w[n];

int main()

printf("%d", f[n][m]);

return 0;

}

優化後:(優化後在具體理解方式上還是要按照二維陣列的思路來)

#includeusing namespace std;

const int n = 1010;

int f[n], n, m, v[n], w[n];

int main()

0~1揹包與完全揹包對比:

0~1揹包:取左邊狀態和左上(不嚴格左上)狀態的最大值。

完全揹包:取左邊狀態和正上面(不一定相鄰的上面)狀態的最大值。

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

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

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

有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。第i種物品的費用是w i 價值是v i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。貪心 y or n 因為每件物品都可以選取任意件,你也許會想到貪心演算法 選取價值最高的就好了 看上去沒什麼毛病,但是有乙個問題...

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

問題背景描述 你有乙個容量為v的揹包,現在有n種物品供你選擇,每件物品可以選擇無數次,每種物品所佔的空間為c i 價值為v i 現在讓你作出最佳方案,使揹包中的總價值最大。有了之前01揹包的基礎,我們很快就能寫出完全揹包的狀態轉移方程 f i j max 但是這樣的時間複雜度就很大了o v v c ...