問題背景描述:
你有乙個容量為v的揹包,現在有n種物品供你選擇,每件物品可以選擇無數次,每種物品所佔的空間為c[i],價值為v[i],現在讓你作出最佳方案,使揹包中的總價值最大。
有了之前01揹包的基礎,我們很快就能寫出完全揹包的狀態轉移方程
f[i][j] = max
但是這樣的時間複雜度就很大了o(v*∑v/c[i])
這裡我提供一種o(vn)演算法
在01揹包中提到在用滾動陣列的方法時候,我們要將內層循壞寫逆序的,這樣是為了保證在考慮要不要拿第i件物品時依賴的是乙個沒有選入i物品的f[i-1][j – c[i]],而在這裡恰恰是需要乙個可能選入了第i件物品的f[i][j – c[i]],所以,我們就可以輕鬆地寫出o(vn)演算法了
貼上**:
for
(int i =
1; i <= n; i++
)//n表示物品種類 v表示揹包容量
for(
int j = c[i]
; j <= v; j++
) f[j]
=max
(f[j]
, f[j - c[i]
]+ v[i]);
cout << f[v]
;
動態規劃揹包問題 完全揹包
問題描述 有n種物品,每種均有無窮多個。第i個物品的體積為vi,重量為wi。選一些物品裝到容量為c的揹包中,使得揹包內物品在總體積不超過c的前提下重量盡量大。問題分析 開乙個陣列f i j 表示前i種物品中選取若干件物品放入剩餘空間為j的揹包中所能得到的最大重量。每種物品無窮個,所以還要有乙個k遍歷...
動態規劃 揹包問題 完全揹包
有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。第i種物品的費用是w i 價值是v i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。貪心 y or n 因為每件物品都可以選取任意件,你也許會想到貪心演算法 選取價值最高的就好了 看上去沒什麼毛病,但是有乙個問題...
動態規劃 揹包問題(01揹包 完全揹包)
揹包問題 多種物品 重量不同 價值不同 你可以取最多重量不超過w的物品,問最大價值為多少?01揹包 指的是 有n個物品 每個物品的重量為w i 價值為v i 每個物品只有乙個 所有面臨這些物品只有兩種結果 1 拿這件物品,揹包容量減去w i 此時的價值增加v i 2 不拿這件物品,揹包容量不變,最大...