题解 | #称砝码#

称砝码

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)
}()

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务