# 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);
}()
上一篇: 下一篇:
本章目录