動態規劃之完全揹包問題

2021-07-09 17:25:13 字數 1578 閱讀 2408

問題描述:與0-1揹包問題不同之處在於,對各種物品有無數件

解題思路:由於第i件物品件數不限,導致f[i][v]不再像0-1揹包那樣只有兩種情況:i物品放入和不放入,而是有多種情況:i物品不放入,放入一件,放入兩件。。。在這幾種情況中選取最大值。用公式表示就是:

f[i][v]=max,k是保證k*v[i]<=v的最大整數。

c++**:

//完全揹包問題

#include #include #include using namespace std;

int max(int a, int b)

void print_elems(vector& v)

cout << endl;

}int main(void)

; int b = ;

int max_weight = 10;

vectorvalues(a, a + 6);

vectorweight(b, b + 6);

int row = values.size();

int column = max_weight + 1;

vectorf(column, 0);

int i, j;

for (i = 1; i < row; ++i)

}print_elems(f);

} return 0;

}

執行結果:

1 可以把重量大價值小的物品去掉,這是0-1揹包所不允許的,因為即使是重量大價值小的物品也有可能有派上用場的時候(揹包足夠大),但完全揹包不存在該問題,因為重量小價值高的物品不限量**!但該方法不能從根本上解決時間複雜度問題,只有在資料較大時才有可能顯示出效果

2雖說每件物品不限量,但揹包容量有限,第i件物品頂多放v/v[i]件,那我們可以假設0-1揹包,有v/v[i]件i物品,這樣就回到了0-1揹包問題,但問題是該做法時間複雜度仍和我們之前**相同。

o(vn)時間複雜度,o(v)空間複雜度

c++**:

//完全揹包問題

#include #include #include using namespace std;

int max(int a, int b)

void print_elems(vector& v)

cout << endl;

}int main(void)

; int b = ;

int max_weight = 10;

vectorvalues(a, a + 6);

vectorweight(b, b + 6);

int row = values.size();

int column = max_weight + 1;

vectorf(column, 0);

int i, j;

for (i = 1; i < row; ++i)

}print_elems(f);

} return 0;

}

動態規劃揹包問題 完全揹包

問題描述 有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 ...