0/1 背包
Posted nowgood
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了0/1 背包相关的知识,希望对你有一定的参考价值。
?
#include <iostream>
#include <vector>
using namespace std;
/*
* 有 N 件物品和一个容量为C的背包, 第i件物品的体积是 W[i],价值是 V[i]。
* 求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。
*/
int main () {
vector<int> weights {4, 6, 2, 2, 5, 1};
vector<int> values {8, 10, 6, 3, 7, 2}; // output 24
int total_capacity = 12;
auto num = weights.size();
if (total_capacity <= 0) {
cout << 0 << endl;
return 0;
}
// maximum_value[i][j] 的含义:
// 将前 i 个物品中的一些物品装入容量为 j 的背包所能产生的最大价值
vector<vector<int>> maximum_value(num+1, vector<int>(total_capacity+1, 0));
for (int i_item = 1; i_item < num+1; i_item++) {
for (int volume = 1; volume <= total_capacity; volume++) {
if (weights[i_item-1] > volume) {
maximum_value[i_item][volume] = maximum_value[i_item-1][volume];
} else {
maximum_value[i_item][volume] = max(maximum_value[i_item-1][volume],
maximum_value[i_item-1][volume-weights[i_item-1]]
+values[i_item-1]);
}
}
}
cout << maximum_value[num-1][total_capacity];
return 0;
}
以上是关于0/1 背包的主要内容,如果未能解决你的问题,请参考以下文章