js贪心算法 钱币找零问题代码实例


Posted in Javascript onSeptember 11, 2019

给定一组硬币的面额,以及要找零的钱数,计算出符合找零钱数的最少硬币数量。

例如,美国硬币面额有1、5、10、25这四种面额,如果要找36美分的零钱,则得出的最少硬币数应该是1个25美分、1个10美分和1个10美分共三个硬币。这个算法要解决的就是诸如此类的问题。我们来看看如何用动态规划的方式来解决。

对于每一种面额,我们都分别计算所需要的硬币数量。具体算法如下:

  1. 如果全部用1美分的硬币,一共需要36个硬币
  2. 如果用5美分的硬币,则需要7个5美分的硬币 + 1个1美分的硬币 = 8个硬币
  3. 如果用10美分的硬币,则需要3个10美分的硬币 + 1个5美分的硬币 + 1个1美分的硬币 = 5个硬币
  4. 如果用25美分的硬币,则需要1个25美分的硬币 + 1个10美分的硬币 + 1个1美分的硬币 = 3个硬币

示意图

js贪心算法 钱币找零问题代码实例

方案4的硬币总数最少,因此为最优方案。

具体的代码实现如下:

function minCoinChange(coins, amount) {
  let result = null;
  if (!amount) return result;

  const makeChange = (index, value, min) => {
    let coin = coins[index];
    let newAmount = Math.floor(value / coin);
    if (newAmount) min[coin] = newAmount;
    if (value % coin !== 0) {
      makeChange(--index, value - coin * newAmount, min);
    }
  };

  const arr = [];
  for (let i = 0; i < coins.length; i++) {
    const cache = {};
    makeChange(i, amount, cache);
    arr.push(cache);
  }
  console.log(arr);
  let newMin = 0;
  arr.forEach(item => {
    let min = 0;
    for (let v in item) min += item[v];
    if (!newMin || min < newMin) {
      newMin = min;
      result = item;
    }
  });
  return result;
}

函数minCoinChange()接收一组硬币的面额,以及要找零的钱数。我们将上面例子中的值传入:

const result = minCoinChange2([1, 5, 10, 25], 36);
console.log(result);

得到如下结果:

[
 { '1': 36 },
 { '1': 1, '5': 7 },
 { '1': 1, '5': 1, '10': 3 },
 { '1': 1, '10': 1, '25': 1 }
]
{ '1': 1, '10': 1, '25': 1 }

上面的数组是我们在代码中打印出来的arr的值,用来展示四种不同面额的硬币作为找零硬币时,实际所需要的硬币种类和数量。最终,我们会计算arr数组中硬币总数最少的那个方案,作为minCoinChange()函数的输出。

当然在实际应用中,我们可以把硬币抽象成任何你需要的数字,这个算法能给出你满足结果的最小组合。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
基于jQuery制作迷你背词汇工具
Jul 27 Javascript
jquery统计复选框选中示例
Nov 05 Javascript
Javascript排序算法之计数排序的实例
Apr 05 Javascript
JavaScript实现继承的4种方法总结
Oct 16 Javascript
Javascript动态创建表格及删除行列的方法
May 15 Javascript
jQuery基于cookie实现的购物车实例分析
Dec 24 Javascript
javascript HTML5 Canvas实现圆盘抽奖功能
Apr 11 Javascript
JS简单实现点击复制链接的方法
Aug 03 Javascript
Angularjs 动态添加指令并绑定事件的方法
Apr 13 Javascript
JavaScript实现的反序列化json字符串操作示例
Jul 18 Javascript
JavaScript 面向对象程序设计详解【类的创建、实例对象、构造函数、原型等】
May 12 Javascript
vue中的v-model原理,与组件自定义v-model详解
Aug 04 Javascript
解决layui使用layui-icon出现默认图标的问题
Sep 11 #Javascript
js图数据结构处理 迪杰斯特拉算法代码实例
Sep 11 #Javascript
js简单的分页器插件代码实例
Sep 11 #Javascript
解决在layer.open中使用时间控件laydate失败的问题
Sep 11 #Javascript
关于ckeditor在bootstrap中modal中弹框无法输入的解决方法
Sep 11 #Javascript
layer弹出层扩展主题的方法
Sep 11 #Javascript
手写Vue弹窗Modal的实现代码
Sep 11 #Javascript
You might like
php实现socket推送技术的示例
2017/12/20 PHP
php实现有序数组旋转后寻找最小值方法
2018/09/27 PHP
JQuery 简便实现页面元素数据验证功能
2007/03/24 Javascript
JavaScript 封装Ajax传递的数据代码
2009/06/05 Javascript
jQuery AJAX回调函数this指向问题
2010/02/08 Javascript
基于jQuery的淡入淡出可自动切换的幻灯插件
2010/08/24 Javascript
jquery获取自定义属性(attr和prop)实例介绍
2013/04/21 Javascript
jQuery在iframe中无法弹出对话框的解决方法
2014/01/12 Javascript
Iframe实现跨浏览器自适应高度解决方法
2014/09/02 Javascript
AngularJS入门教程之学习环境搭建
2014/12/06 Javascript
JavaScript中number转换成string介绍
2014/12/31 Javascript
让JavaScript中setTimeout支持链式操作的方法
2015/06/19 Javascript
vue中通过使用$attrs实现组件之间的数据传递功能
2019/09/01 Javascript
layui 对table中的数据进行转义的实例
2019/09/12 Javascript
js判断鼠标移入移出方向的方法
2020/06/24 Javascript
vue实现简易图片左右旋转,上一张,下一张组件案例
2020/07/31 Javascript
详解vue3中组件的非兼容变更
2021/03/03 Vue.js
[03:42]2014DOTA2西雅图国际邀请赛7月9日TOPPLAY
2014/07/09 DOTA
python缩进区别分析
2014/02/15 Python
python实现简单ftp客户端的方法
2015/06/28 Python
Django查找网站项目根目录和对正则表达式的支持
2015/07/15 Python
IntelliJ IDEA安装运行python插件方法
2018/12/10 Python
解决python运行效率不高的问题
2020/07/20 Python
如何通过安装HomeBrew来安装Python3
2020/12/23 Python
彻底弄明白CSS3的Media Queries(跨平台设计)
2010/07/27 HTML / CSS
学生档案自我鉴定
2013/10/07 职场文书
新闻专业应届生求职信
2013/10/31 职场文书
大学考试作弊检讨书
2014/01/30 职场文书
简单的大学生自我鉴定
2014/02/18 职场文书
二年级班级文化建设方案
2014/05/10 职场文书
教师遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
2015年六年级班主任工作总结
2015/10/15 职场文书
Golang之sync.Pool使用详解
2021/05/06 Golang
CSS 实现角标效果的完整代码
2022/06/28 HTML / CSS
Spring Boot实现文件上传下载
2022/08/14 Java/Android
Redis主从复制操作和配置详情
2022/09/23 Redis