题解 | #称砝码#普通循环遍历和回溯法,回溯法时间复杂度大
称砝码
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 while(n = Number(await readline())){ let weights = (await readline()).split(' ').map(Number); let nums = (await readline()).split(' ').map(Number); // 把所有砝码放在一个数组,遍历这个数组,在改遍历中再遍历res的每一项,然后加weights[i] weights = weights.reduce((pre, cur, i) => pre.concat(new Array(nums[i]).fill(cur)), []); let res = new Set([0]); for (let i = 0; i < weights.length; i++) { [...res].forEach(v => { res.add(v + weights[i]); }); } // 这里用回溯法,时间复杂度大,数据多的时候时间过不了,看看哪个大神有优化方案 // let used = new Set(); // backtrack(0, 0); // function backtrack(index, sum) { // res.add(sum); // if (index >= weights.length) return; // for (let i = index; i < weights.length; i++) { // if (!used.has(i)) { // used.add(i); // backtrack(i, sum + weights[i]) // used.delete(i); // } // } // } console.log(res.size); } }()