首页 > 试题广场 >

多重背包

[编程题]多重背包
  • 热度指数:2580 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 128M,其他语言256M
  • 算法知识视频讲解
有一个体积为V的背包,有m种物品,每种物品有体积和价值,且数量一定。求背包能装下的最大价值。

输入描述:
第一行两个整数V和m。
接下来m行,每行3个整数,表示第i种物品的数量、体积和价值。
,个数、体积、价值不超过1000。


输出描述:
输出一个整数,表示背包能装下的最大价值。
示例1

输入

10 4
2 3 2
2 4 3
1 2 2
4 5 3

输出

8
参考了很多大佬的Java和c++代码,前端狗的JavaScript版本来了!
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void (async function () {
    // Write your code here
    const arr1 = (await readline()).split(" ");
    const capacity = parseInt(arr1[0]);
    const n = parseInt(arr1[1]);
    const amounts = [];
    const weights = [];
    const values = [];
    for (let i = 0; i < n; i++) {
        let tokens = (await readline()).split(" ");
        amounts.push(parseInt(tokens[0]));
        weights.push(parseInt(tokens[1]));
        values.push(parseInt(tokens[2]));
    }
    const dp = new Array(capacity + 1).fill(0);
    for (let i = 0; i < n; i++) {
        if (weights[i] >= capacity) {
            zero_oneBP(1);
        }
        let k = 1;
        while (k <= amounts[i]) {
            zero_oneBP(k);
            amounts[i] -= k;
            k = k * 2;
        }

        if (amounts[i] > 0) zero_oneBP(amounts[i]);

        function zero_oneBP(k) {
            for (
                let remain_v = capacity;
                remain_v >= k * weights[i];
                remain_v--
            ) {
                let temp = k * values[i] + dp[remain_v - k * weights[i]];
                dp[remain_v] = Math.max(temp, dp[remain_v]);
            }
        }
    }
    console.log(dp[capacity]);
})();


发表于 2023-03-19 22:41:12 回复(0)