题解 | #称砝码#
称砝码
https://www.nowcoder.com/practice/f9a4c19050fc477e9e27eb75f3bfd49c
解题的思路写在了代码里
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 let count = await readline() let g = (await readline()).split(" ").map(v => +v) // 每种砝码的重量 let num = (await readline()).split(" ").map(v => +v) // 每种砝码的数量 let arr = [] // 存放所有重量的砝码 for(let i = 0;i<g.length;i++){ arr.push(...new Array(num[i]).fill(g[i])) } // arr = [1,1,2] // 循环从arr中取值,每个值可以取可以不取 let set = new Set([0,arr[0]]) // 当每次碰到 arr 的一个项之后,都用之前的所有值的可能性,加上这一项。 // 1. 比如 若求 [1,1,2]的所有解,即求[1,1]的所有解之后,再给所有的解加上2 // 2. 若求[1,1]的所有解,就是求[1]的所有解,然后再加 1 // 3. [1] 的所有解就是 0,1 // 4. 所以第2步的 [1,1] 的所有解就是 0,1, 1,2 // 5. 所以第1步的 [1,1,2]的所有解就是 0,1, 1,2, 2,3,4 // 然后去重之后就是 0,1,2,3,4 // 共5个解 // 以上是最开始的思路,用的数组去存,然后去重,后面发现用时很长,因为到后面需要加的数字越来越多,几何式增长,需要600ms+ 后面就直接采用set存,并且往里面添加 for(let i = 1;i<arr.length;i++){ let sumArr = [...set] sumArr.forEach(v => set.add(v+arr[i])) } console.log(set.size) }()