题目描述
假设有一件价格为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")
}
测试结果如下图所示