华为机考 购物车问题 javascript

 

 

const readline = require('readline')
const r1= readline.createInterface({
  input:process.stdin,
  output:process.stdout
})
let condition = null
let lines = []
r1.on('line',(line)=>{
  if(!condition){
    condition = line.split(' ').map(Number)
  }else{
    lines.push(line.split(' ').map(Number))
    if(lines.length===condition[1]){
      r1.close()
    }
  }
})

r1.on('close',()=>{
  let [sum,total] = condition
  sum = sum /10
  let map = {}
  let map2 = {}
  lines.forEach((item,index)=>{
    let price = item[0]
    let weight = item[0]*item[1]
    if(!item[2]){
      map[index]?map[index]=[[price,weight]]||[]:map[index]=[[price,weight]]
    }else{
      map2[item[2]]?map2[item[2]].push([price,weight]):map2[item[2]] = [[price,weight]]
    }
  })
  for(let k in map2){
    map2[k].forEach(item=>{
      let temp = []
      map[+k-1].forEach(value=>{
        temp.push([value[0]+item[0],value[1]+item[1]])
      })
      map[+k-1].push(...temp)
    })
  }
  let newArr = []
  for(let k in map){
    newArr.push(map[k])
  }
  getMax(sum,newArr)
})

function getMax(sum,newArr){
  let dp = new Array(newArr.length)
  for(let i =0;i<dp.length;i++){
    dp[i]=new Array(sum+1).fill(0)
  }
  for(let i = 0;i<dp[0].length;i++){
    let money = 10*i
    let weight = 0
    let arr = newArr[0].filter(item=>{return item[0]<=money})
    arr=arr.map(item=>item[1])
    if(arr.length>0){
      weight = Math.max(...arr)
    }
    dp[0][i]=weight
  }
  for(let i =1;i<dp.length;i++){
    for(let j=1;j<dp[i].length;j++){
      let top = dp[i-1][j]
      let temparr = []
      newArr[i].forEach(item=>{
        let mp =j-item[0]/10
        if(mp>=0){
          temparr.push(dp[i-1][mp]+item[1])
        }
      })
      dp[i][j] = Math.max(top,...temparr)
    }
  }
  console.log(dp[dp.length-1][dp[0].length-1])
}

思路:01背包问题,用动态规划

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值