阅读背景:

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;
}#include <iostream>
#include <vector>
using 



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: