完全揹包問題:
有n種物品,每種物品的單件重量為w[i],價值為c[i]。現有乙個容量為v的揹包,問如何選取物品放入揹包,使得揹包內物品的總價值最大。其中每種物品都有無窮件。
完全揹包問題與01揹包問題的區別:
完全揹包的物品數量每種有無窮件,選取物品時對同一種物品可以選1件、選2件…只要不超過容量v即可,而01揹包的物品數量每種只有一件。
完全揹包問題的每種物品都有兩種策略:
①不放第i件物品,那麼(dp[i][j]=dp[i-1][j])二維數
組二維
陣列= >(dp[j]=dp[j] )一維數
組一維
陣列②放第i件物品。處理與01揹包有所不同,因為01揹包的每個物品只能選擇乙個,因此(dp[i][j]=dp[i-1],j-arr[i].v)二維數
組二維
陣列= >(dp[j]=dp[j-arr[v] )一維數
組一維
陣列;但完全揹包如果選擇第i件物品之後,轉移到是(dp[i][j]=dp[i],j-arr[i].v)二維數
組二維
陣列= >(dp[j]=dp[j-arr[v] )一維數
組一維
陣列這個狀態,因為每種物品可以放任意件,放了第i件物品之後還可以繼續放第i件物品,直到第二維的j-arr[i].v無法保持大於等於0為止。
01揹包code:
#include
#include
#include
using
namespace std;
int n,m;
struct t
;vectorarr;
vector<
int>dp;
intmain()
for(
int i=
0;i)for
(int j=m;j>=arr[i]
.v;j--
) dp[j]
=max
(dp[j]
,dp[j-arr[i]
.v]+arr[i]
.w);
cout<
;return0;
}
完全揹包code:
#include
#include
#include
using
namespace std;
int n,m;
struct t
;vectorarr;
vector<
int>dp;
intmain()
for(
int i=
0;i)for
(int j=arr[i]
.v;j<=m;j++
) dp[j]
=max
(dp[j]
,dp[j-arr[i]
.v]+arr[i]
.w);
cout<
;return0;
}
dp動態規劃 完全揹包問題
問題描述 有n種重量和價值分別為wi,vi 的物品。從這些物品中挑選總重量不超過maxvalue的物品,求挑選物品價值總和的最大值。在這裡,每種物品可以挑選任意多件。限制條件 1 n 100 1 wi,vi 100 1 maxvalue 10000 輸入 3 4 4 52 3 輸出 include ...
動態規劃揹包問題 完全揹包
問題描述 有n種物品,每種均有無窮多個。第i個物品的體積為vi,重量為wi。選一些物品裝到容量為c的揹包中,使得揹包內物品在總體積不超過c的前提下重量盡量大。問題分析 開乙個陣列f i j 表示前i種物品中選取若干件物品放入剩餘空間為j的揹包中所能得到的最大重量。每種物品無窮個,所以還要有乙個k遍歷...
動態規劃 揹包問題 完全揹包
有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。第i種物品的費用是w i 價值是v i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。貪心 y or n 因為每件物品都可以選取任意件,你也許會想到貪心演算法 選取價值最高的就好了 看上去沒什麼毛病,但是有乙個問題...