C++——在这次活动中,他可以在限定时间内尽可能多地把自己喜欢的商品放进购物车,而不需要花费一分钱。购物车的最大承重为 W,他希望在不超载的情况下,尽可能获取价值最大的商品。

 超市中有 n 种商品,每种商品的价值为 vi,重量为 wi,每种商品的数量为 mi。小明的目标是选择一些商品,使购物车的总重量不超过 W,同时获取的商品总价值最大。 输入格式: · 第一行包含两个整数 n 和 W,分别表示商品种类的数量和购物车的最大承重(n和W中间使用一个空格隔开)。接下来的 n行,每行包含三个整数vi、wi、mi,分别表示第 i 种商品的价值、重量和数量(每一行的vi、wi、mi中间使用一个空格隔开,mi后不可有空格)。

输出格式: 输出一个整数,表示在不超载的情况下,小明能够获取的最大商品总价值。 输入样例1: 4 20 3 9 3 5 9 1 9 4 2 8 1 3 输出样例1: 47 输入样例2: 3 8 5 3 1 9 4 2 7 2 2 输出样例2: 23

没注释的源代码

#include

using namespace std;

int my_max(int a, int b) {
    return a > b? a : b;
}

int main() {
    int n, W;
    cin >> n >> W;

    int items[100][3];

    for (int i = 0; i < n; ++i) {
        cin >> items[i][0] >> items[i][1] >> items[i][2];
    }

    int dp[101][1001];

    for (int i = 0; i <= n; ++i) {
        for (int j = 0; j <= W; ++j) {
            if (i == 0 || j == 0) {
                dp[i][j] = 0;
            }
        }
    }

    for (int i = 1; i <= n; ++i) {
        int vi = items[i - 1][0];
        int wi = 2 * items[i - 1][1];
        int mi = items[i - 1][2];

        for (int j = 1; j <= W; ++j) {
            dp[i][j] = dp[i - 1][j];

            for (int k = 0; k <= mi && k * wi <= j; k++) {
                int temp = dp[i - 1][j - k * wi] + k * vi;
                if (temp > dp[i][j]) {
                    dp[i][j] = temp;
                }
            }
        }
    }

    cout << dp[n][W] << endl;

    return 0;
}

 

你可能感兴趣的:(c++,开发语言,算法)