题解 | #称砝码#
称砝码
https://www.nowcoder.com/practice/f9a4c19050fc477e9e27eb75f3bfd49c
const readline = require('readline') const rl = readline.createInterface({ input: process.stdin, output: process.stdout }) // 动态规划,超出内存限制 /*function test(type,k,n){ const set = new Set() // dp[i]表示在第i个砝码下,可以称重的重量 const dp = new Array(type).fill(0).map(item => []) // 第i个砝码能称重的重量(这个意识是只有第1个砝码的前提,不加上前面的砝码) for(let i=0;i<=n[0];i++){ dp[0].push(i * k[0]) } for(let i=1;i<type;i++){ const temp = [] // 第i个砝码能称重的重量(这个意识是只有第i+1个砝码的前提,不加上前面的砝码) for(let j=0;j<=n[i];j++){ temp.push(j * k[i]) } for(const item of dp[i-1]){ for(const value of temp){ const m = item + value if(!set.has(m)){ dp[i].push(item + value) set.add(m) } } set.clear() } } const res = new Set(dp[type-1]) console.log(res.size) }*/ function test(type,k,n){ // 将砝码的用数字序列表示,比如两个一克,一个两克的砝码用[1,1,2]表示 let fama = [] for(let i=0;i<k.length;i++){ for(let j=0;j<n[i];j++){ fama.push(k[i]) } } let set = new Set() // 用set来表示加入当前砝码前能产生的不同重量的种数,结果使用size属性,本身set就能去重 set.add(0) // set初始化为0,因为可以称重0的重量 // 每次插入set中所有元素加上当前砝码重量的值。比如第一个加入1g的砝码,插入{0+1},因为初始set:{0},所以插入后为{0,1} for(let i=0;i<fama.length;i++){ let temp = [...set] for(const item of temp){ set.add(item + fama[i]) } } console.log(set.size) } const arr = [] rl.on('line',function(line){ arr.push(line) }) rl.on('close',function(){ const param1 = parseInt(arr[0]) const param2 = arr[1].split(' ').map(item => Number(item)) const param3 = arr[2].split(' ').map(item => Number(item)) test(param1,param2,param3) })