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 背包的主要内容,如果未能解决你的问题,请参考以下文章

背包0-1背包与完全背包一维数组实现

0-1背包问题

0-1背包问题

0-1背包问题

0-1背包问题的回溯法中,剪枝用的上界函数问题

0/1背包