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 相关文章推荐
js兼容标准的表格变色效果
Jun 28 Javascript
在IE6下发生Internet Explorer cannot open the Internet site错误
Jun 21 Javascript
jQuery EasyUI API 中文文档 - DataGrid数据表格
Nov 17 Javascript
js函数排序的实例代码
Jul 01 Javascript
jQuery实现订单提交页发送短信功能前端处理方法
Jul 04 Javascript
微信小程序  简单实例(阅读器)的实例开发
Sep 29 Javascript
js绑定事件和解绑事件
Apr 27 Javascript
webpack+vue中使用别名路径引用静态图片地址
Nov 20 Javascript
VueCli3构建TS项目的方法步骤
Nov 07 Javascript
ES6 迭代器与可迭代对象的实现
Feb 11 Javascript
微信小程序下拉菜单效果的实例代码
May 14 Javascript
利用 Chrome Dev Tools 进行页面性能分析的步骤说明(前端性能优化)
Feb 24 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 删除数组元素
2009/01/16 PHP
php获取ip的三个属性区别介绍(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)
2012/09/23 PHP
Laravel 5框架学习之数据库迁移(Migrations)
2015/04/08 PHP
php判断手机浏览还是web浏览,并执行相应的动作简单实例
2016/07/28 PHP
PHP序列化操作方法分析
2016/09/28 PHP
php实现websocket实时消息推送
2018/03/30 PHP
php+Ajax无刷新验证用户名操作实例详解
2019/03/04 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
2019/12/20 PHP
基于JQuery实现鼠标点击文本框显示隐藏提示文本
2012/02/23 Javascript
JavaScript Window浏览器对象模型方法与属性汇总
2015/04/20 Javascript
JavaScript中函数(Function)的apply与call理解
2015/07/08 Javascript
Javascript的表单与验证-非空验证
2016/03/18 Javascript
js实现浏览器倒计时跳转页面效果
2016/08/12 Javascript
JS实现类似51job上的地区选择效果示例
2016/11/17 Javascript
Bootstrap 3 按钮标签实例代码
2017/02/21 Javascript
$.browser.msie 为空或不是对象问题的多种解决方法
2017/03/19 Javascript
前端把html表格生成为excel表格的实例
2017/09/19 Javascript
JavaScript判断日期时间差的实例代码
2018/03/01 Javascript
JavaScript简单实现关键字文本搜索高亮显示功能示例
2018/07/25 Javascript
详解mpvue开发微信小程序基础知识
2019/09/23 Javascript
vue使用prop可以渲染但是打印台报错的解决方式
2019/11/13 Javascript
Vue 技巧之控制父类的 slot
2020/02/24 Javascript
JQuery复选框全选效果如何实现
2020/05/08 jQuery
javascript+Canvas实现画板功能
2020/06/23 Javascript
基于ant design日期控件使用_仅月份的操作
2020/10/27 Javascript
[50:24]VGJ.S vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
python 命令行传入参数实现解析
2019/08/30 Python
pytorch 中的重要模块化接口nn.Module的使用
2020/04/02 Python
python:HDF和CSV存储优劣对比分析
2020/06/08 Python
Python读写压缩文件的方法
2020/07/30 Python
CSS3 实现雷达扫描图的示例代码
2020/09/21 HTML / CSS
新锐科技Java程序员面试题
2016/07/25 面试题
幼儿园教学工作总结2015
2015/05/12 职场文书
HR必备:超全面的薪酬待遇管理方案!
2019/07/12 职场文书
JavaScript控制台的更多功能
2021/04/28 Javascript
Spring boot应用启动后首次访问很慢的解决方案
2021/06/23 Java/Android