题解 | #称砝码#
称砝码
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)
})
查看7道真题和解析

腾讯成长空间 5958人发布