【中等】算法nodeJs:称砝码

83 阅读1分钟

描述

对于给定的 n 种砝码,重量互不相等,依次为 m1​,m2​,…,mn​ ,数量依次为 x1​,x2​,…,xn​ ,
现在要用这些砝码去称物体的重量(放在同一侧),问能称出多少种不同的重量。特别地,称重重量包括 0 。

输入描述:

第一行输入一个整数 n(1≦n≦10) 代表砝码的个数。
第二行输入 n 个整数 m1​,m2​,…,mn​(1≦mi​≦2000) 代表每种砝码的重量。
第三行输入 n 个整数 x1​,x2​,…,xn​(1≦xi​≦10) 代表每种砝码的数量。

输出描述:

输出一个整数,代表利用给定的砝码可以称出的不同的重量数。

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void (async function () {
    const n = parseInt(await readline()); // 砝码种类数
    const m = (await readline()).split(" ").map(Number); // 每种砝码的重量
    const x = (await readline()).split(" ").map(Number); // 每种砝码的数量

    // 初始化 dp 集合
    const dp = new Set();
    dp.add(0); // 初始状态,重量为 0

    for (let i = 0; i < n; i++) {
        const weight = m[i]; // 当前砝码的重量
        const count = x[i]; // 当前砝码的数量
        const currentDp = Array.from(dp); // 当前 dp 集合的快照

        for (let w of currentDp) {
            for (let k = 1; k < count + 1; k++) {
                dp.add(w + k * weight);
            }
        }
    }
    console.log(dp.size)
})();