背包问题
参考:
示例:
01背包
有n 个物品,它们有各自的重量和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?
二维数组:
伪代码:
示例代码:
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
int max_value(int C, const vector<int> &W, const vector<int> &V) {
vector<int> dp(C + 1, 0);
for (int i = 0; i < W.size(); i++)
for (int j = C; j >= W[i]; j--)
dp[j] = max(dp[j], dp[j - W[i]] + V[i]);
return dp[C];
}
int main() {
/* test1 */
//int C = 8; // capacity, max_value=10
//vector<int> W{ 2,3,4,5 }; // weight
//vector<int> V{ 3,4,5,6 }; // value
/* test2 */
//int C = 10; // capacity, max_value=13
//vector<int> W{ 2,3,5,5 }; // weight
//vector<int> V{ 2,4,3,7 }; // value
/* test3 */
int C = 11; // capacity, max_value=40
vector<int> W{ 1,2,5,6,7 }; // weight
vector<int> V{ 1,6,18,22,28 }; // value
int m = max_value(C, W, V);
cout << "max_value: " << m << endl;
}
多重背包
示例代码:
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
int max_value(int C, const vector<int> &W, const vector<int> &V, const vector<int> &N) {
vector<int> dp(C + 1, 0);
for (int i = 0; i < W.size(); i++)
for (int j = C; j >= W[i]; j--)
for (int k = 1; k <= N[i]; k++)
if (j >= k*W[i])
dp[j] = max(dp[j], dp[j - k*W[i]] + k*V[i]);
return dp[C];
}
int main() {
/* test1 */
int C = 10; // capacity, max_value=13
vector<int> W{ 10,3,4,5 }; // weight
vector<int> V{ 3,4,6,7 }; // value
vector<int> N{ 5,1,2,1 }; // number
/* test2 */
//int C = 8; // capacity, max_value=64
//vector<int> W{ 2,2,1 }; // weight
//vector<int> V{ 20,10,6 }; // value
//vector<int> N{ 2,5,10 }; // number
int m = max_value(C, W, V, N);
cout << "max_value: " << m << endl;
}
完全背包
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
int max_value(int C, const vector<int> &W, const vector<int> &V) {
vector<int> dp(C + 1, 0);
for (int i = 0; i < W.size(); i++)
for (int j = W[i]; j <= C; j++)
dp[j] = max(dp[j], dp[j - W[i]] + V[i]);
return dp[C];
}
int main() {
/* test1 */
//int C = 10; // capacity, max_value=12
//vector<int> W{ 7,4,3,2 }; // weight
//vector<int> V{ 9,5,3,1 }; // value
/* test2 */
int C = 10; // capacity, max_value=14
vector<int> W{ 10,3,4,5 }; // weight
vector<int> V{ 3,4,6,7 }; // value
int m = max_value(C, W, V);
cout << "max_value: " << m << endl;
}