题解 | #称砝码#

称砝码

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

全部评论

相关推荐

头像
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务