# HJ41 称砝码

https://www.nowcoder.com/practice/f9a4c19050fc477e9e27eb75f3bfd49c (opens new window)

# 描述

现有n种砝码,重量互不相等,分别为 m1,m2,m3…mn ;

每种砝码对应的数量为 x1,x2,x3...xn 。现在要用这些砝码去称物体的重量(放在同一侧),问能称出多少种不同的重量。

注:

称重重量包括 0

输入描述:

对于每组测试数据:
第一行:n --- 砝码的种数(范围[1,10])
第二行:m1 m2 m3 ... mn --- 每种砝码的重量(范围[1,2000])
第三行:x1 x2 x3 .... xn --- 每种砝码对应的数量(范围[1,10])

输出描述:

利用给定的砝码可以称出的不同的重量数

示例1

输入:
2
1 2
2 1

输出:
5

说明:
可以表示出0,1,2,3,4五种重量。   

# 解答

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
/*
    1. 首先根据输入顺序,将砝码用数字序列表示,例如2个1g和1个2g,就用 1 1 2的序列表示;
    2. set序列用来表示加入当前砝码之前能产生的重量种类;
    3. set初始化为{0};当第一个1g砝码放入时,则set中需要插入原先set中的所有元素+1g后的结果;即{0, 0+1};
    4. 当第二个1g加入时,则set会插入{0+1, 1+1},就变成了{0, 1, 2};
    5. 重复上述步骤加入所有砝码;则最后set的大小即为能产生的重量种类。
*/
void async function () {
    let line;
    let lines = [];
    while(line = await readline()){
        lines.push(line);
    }

    const types = lines[1].split(' ').map(i => Number(i));
    const nums = lines[2].split(' ').map(i => Number(i));

    const arr = [];

    types.forEach((t, index) => {
        const n = nums[index];

        for (let i = 0; i < n; i++) {
            arr.push(t);
        }
    });

    arr.sort((a, b) => a - b);

    const results = new Set();

    results.add(0);

    arr.forEach((num) => {
        Array.from(results.values()).forEach((item) => {
            results.add(item + num);
        });
    });

    console.log(results.size);
}()
本章目录