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