算法随笔-花最“少”的钱买东西

题目描述

假设有一件价格为x的商品(x已知),拿一定面额的纸币去买这件商品,如何使纸币的总数最少。目前市面上人命币的面额为(1,5,10,20,50,100)

思路分析

常规思路的话,大概就是进行迭代,对每个面额进行迭代,直到面额数乘面额的和等于价格x为止,当x较小时,效率可能尚可,一旦x过大,时间复杂度就上来了,所以不作考虑,在这里我们也就不花时间去实现。

我的解决方案如下, 根据大O表示法,可得时间复杂度为O(n),且迭代次数小于等于6
PS:有关时间复杂度的概念,可以去看这篇文章 链接在此

function min (price) {
  var price //商品价格
  var x = [1, 5, 10, 20, 50, 100] //各种面额
  var n = [0, 0, 0, 0, 0, 0] //每个面额对应的数量,初始化全为零
  var count = 0 //循环次数

  var data = new Date()
  var startTime = data.getTime() //以ms的形式获取当前时间

  //从最大的面额开始,进行贪婪匹配,此操作依赖于模运算
  for (var i = x.length - 1; i >= 0; i--) {
    if (!price % x[i]) {
      count++
      continue
    }
    else {
      //取商,即是该面额对应的数量
      n[i] = (Math.floor(price / x[i]))
      //然后将模运算的结果赋给price,继续循环
      price = price % x[i]
      count++
      //若模运算结果为0,结束循环
      if (price == 0) break
    }
  }

  var endTime = data.getTime()
  diffTime = endTime - startTime //计算运算时间

  console.log("循环次数:" + count)
  console.log("数量最少的组合为:" + n)
  console.log("耗时:" + diffTime + "ms")
}

测试结果如下图所示
测试结果如图所示

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值