HJ41 称砝码
原题:
描述
现有n种砝码,重量互不相等,分别为 m1,m2,m3…mn ; 每种砝码对应的数量为 x1,x2,x3...xn 。现在要用这些砝码去称物体的重量(放在同一侧),问能称出多少种不同的重量。
注:
称重重量包括 0
数据范围:每组输入数据满足 1≤n≤10 1≤n≤10 , 1≤mi≤2000 1≤m**i≤2000 , 1≤xi≤10 1≤x**i≤10
输入描述:
对于每组测试数据: 第一行:n --- 砝码的种数(范围[1,10]) 第二行:m1 m2 m3 ... mn --- 每种砝码的重量(范围[1,2000]) 第三行:x1 x2 x3 .... xn --- 每种砝码对应的数量(范围[1,10])
输出描述:
利用给定的砝码可以称出的不同的重量数。
示例:
输入:
2 1 2 2 1输出:
5说明:
可以表示出0,1,2,3,4五种重量。
代码&思路:
const rl = require("readline").createInterface({input: process.stdin})
const iter = rl[Symbol.asyncIterator]()
const readline = async () => (await iter.next()).value
void async function() {
// 思路:
// 1,拿到砝码种类的数组,拿到每种砝码对应的数量大数组;(这两个数组一一对应)
// 2,我们先遍历第一个数组,也就是先遍历砝码的种类。拿到第一号砝码后,我们查看一号砝码有多少个,比如有 3 个,我们先拿一个一号砝码,去加集合种的每个值得到一个新值,把新值添加到集合中(集合代表的就是之前那么多放砝码的组合的称量值),然后再拿两个一号砝码,重复上述,再拿三个一号砝码重复上述步骤。
// 3,便利完一号砝码的数量后,我们取二号砝码,再取二号砝码的个数,重复步骤2.
// 这样就存在一种情况,我们拿2个三号砝码去加集合中某个值,假设这个值代表的是单独放2个一号砝码,那么我们相加后的结果就是 放2个三号砝码和2个一号砝码能称多重;把这个值放入集合中,当我们拿4个五号砝码加刚才放入集合中的值的时候,意思就是,2个一号砝码、2个三号砝码和4个五号砝码能称多重。
// 哥们思路描述的不是多好,不好理解的话多找找其他的看看。
// write here
let special = new Set([0]) // 保存的是所有可能的重量
let oneMax = 0 // 临时变量
let w = 0 // 临时变量 保存的是每种砝码的重量
let n = 0 // 临时变量,保存的是每种砝码对应的数量
let specialArr = [] // 临时变量,保存的是 special 集合转变成数组的状态
let types = await readline()
let weight = await readline()
let num = await readline()
types = parseInt(types.trim())
weight = weight.trim().split(' ').map(v => parseInt(v))
num = num.trim().split(' ').map(v => parseInt(v))
weight.forEach((el, index) => {
specialArr = [...special]
w = el
n = num[index]
for(let p=1; p<=n; p++) {
oneMax = w * p
for(let k of specialArr) {
special.add(oneMax + k)
}
}
})
console.log(special.size);
}()