思路:
跟01揹包類似:動態規劃01揹包問題
1、同樣令dp[i][j]表示前i件物品恰好放入容量為j的揹包中能獲得的最大價值。
2、和01揹包一樣,完全揹包問題的每種物品都有兩種策略,不同的是。對第i件物品來說:
(1)不放第i件物品,那麼dp[i][j] = dp[i-1][j],這步跟01揹包是一樣的。
(2)放第i件物品。這裡的處理和01揹包有所不同,因為01揹包的每個物品只能選擇乙個,因此選擇放第i件物品就意味著必須轉移到dp[i-1][j-s[i]]這個狀態;但是完全揹包問題不同,完全揹包如果選擇放第i件物品之後並不是轉移到dp[i-1][j-s[i]]這個狀態;而是轉移到dp[i][j-s[i]],這是因為每種物品可以放任意件。放了第i件物品後還可以繼續放第i件物品,直到第二維的j-w[i]無法保持大於等於0為止。
(如果接著拿i,能獲得最大價值為:dp[i][j-s[i]]+s[i],不接著拿i,能獲得的最大價值為dp[i-1][j])
動態規劃方程為:
if(j) dp[i]
[j]=dp[i-1]
[j];
else
#include
using namespace std;
voidf(
int dp[
100]
[100],
int*s,
int*v,
int n,
int size)
;int
main()
f(dp,s,v,n,size);}
voidf(
int dp[
100]
[100],
int*s,
int*v,
int n,
int size)
for(i=
1;i<=n;i++)}
} cout<[size]
<136
4 83 9
5 76 10
2 61 2
*/
動態規劃揹包問題 完全揹包
問題描述 有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 ...