動態規劃 DP 完全揹包問題

2021-10-06 20:22:38 字數 1604 閱讀 9600

完全揹包問題:

有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 因為每件物品都可以選取任意件,你也許會想到貪心演算法 選取價值最高的就好了 看上去沒什麼毛病,但是有乙個問題...