動態規劃 完全揹包問題

2021-10-08 18:51:18 字數 1051 閱讀 8899

思路:

跟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 ...