多重揹包問題
多重揹包問題限定了一種物品的個數,解決多重揹包問題,只需要把它轉化爲0-1揹包問題即可。比如,有2件價值爲5,重量爲2的同一物品,我們就可以分爲物品a和物品b,a和b的價值都爲5,重量都爲2,但我們把它們視作不同的物品。
#include <iostream>
using namespace std;
#define V 1000
int weight[50 + 1];
int value[50 + 1];
int num[20 + 1];
int f[V + 1];
int max(int a, int b) {
return a > b ? a : b;
}
int main() {
int n, m;
cout << "請輸入物品個數:";
cin >> n;
cout << "請分別輸入" << n << "個物品的重量、價值和數量:" << endl;
for (int i = 1; i <= n; i++) {
cin >> weight[i] >> value[i] >> num[i];
}
int k = n + 1;
for (int i = 1; i <= n; i++) {
while (num[i] != 1) {
weight[k] = weight[i];
value[k] = value[i];
k++;
num[i]--;
}
}
cout << "請輸入揹包容量:";
cin >> m;
for (int i = 1; i <= k; i++) {
for (int j = m; j >= 1; j--) {
if (weight[i] <= j) f[j] = max(f[j], f[j - weight[i]] + value[i]);
}
}
cout << "揹包能放的最大價值爲:" << f[m] << endl;
}
2.完全揹包問題
完全揹包問題是指每種物品都有無限件。
#include <iostream>
#define V 500
using namespace std;
int weight[20 + 1];
int value[20 + 1];
int f[V + 1];
int max(int a, int b) {
return a > b ? a : b;
}
int main() {
int n, m;
cout << "請輸入物品個數:";
cin >> n;
cout << "請分別輸入" << n << "個物品的重量和價值:" << endl;
for (int i = 1; i <= n; i++) {
cin >> weight[i] >> value[i];
}
cout << "請輸入揹包容量:";
cin >> m;
for (int i = 1; i <= n; i++) {
for (int j = weight[i]; j <= m; j++) {
f[j] = max(f[j], f[j - weight[i]] + value[i]);
}
}
cout << "揹包能放的最大價值爲:" << f[m] << endl;
}
1.0-1揹包問題
0-1揹包問題是指每一種物品都只有一件,可以選擇放或者不放
#include <iostream>
#define V 500
using namespace std;
int weight[20 + 1];
int value[20 + 1];
int f[V + 1];
int main() {
int n, m;
cout << "請輸入物品個數:";
cin >> n;
cout << "請分別輸入" << n << "個物品的重量和價值:" << endl;
for (int i = 1; i <= n; i++) {
cin >> weight[i] >> value[i];
}
cout << "請輸入揹包容量:";
cin >> m;
for (int i = 1; i <= n; i++) {
for (int j = m; j >= 1; j--) {
if (weight[i] <= j) {
f[j] = f[j] > f[j - weight[i]] + value[i] ? f[j] : f[j - weight[i]] + value[i];
}
}
}
cout << "揹包能放的最大價值爲:" << f[m] << endl;
}