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 相关文章推荐
xml分页+ajax请求数据源+dom取结果实例代码
Oct 31 Javascript
Tab页界面,用jQuery及Ajax技术实现
Sep 21 Javascript
jQuery ul标签下拉菜单演示代码
Dec 11 Javascript
jQuery学习笔记之 Ajax操作篇(三) - 过程处理
Jun 23 Javascript
JavaScript导出Excel实例详解
Nov 25 Javascript
Bootstrap Paginator分页插件使用方法详解
May 30 Javascript
JS for循环中i++ 和 ++i的区别介绍
Jul 20 Javascript
Bootstrap基本插件学习笔记之Alert警告框(20)
Dec 08 Javascript
Angularjs实现分页和分页算法的示例代码
Dec 23 Javascript
JS操作input标签属性checkbox全选的实现代码
Mar 02 Javascript
Angular2实现自定义双向绑定属性
Mar 22 Javascript
jquery自定义组件实例详解
Dec 31 jQuery
解决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源码之 ext/mysql扩展部分
2009/07/17 PHP
PHP 文件上传全攻略
2010/04/28 PHP
Laravel5.7 数据库操作迁移的实现方法
2019/04/12 PHP
如何用ajax来创建一个XMLHttpRequest对象
2012/12/10 Javascript
js弹窗返回值详解(window.open方式)
2014/01/11 Javascript
动态加载jquery库的方法
2014/02/12 Javascript
javascript 事件处理示例分享
2014/12/31 Javascript
原生javascript实现图片弹窗交互效果
2015/01/12 Javascript
moment.js轻松实现获取当前日期是当年的第几周
2015/02/05 Javascript
javascript获取select值的方法分析
2015/07/02 Javascript
jQuery封装的屏幕居中提示信息代码
2016/06/08 Javascript
AngularJS实现ajax请求的方法
2016/11/22 Javascript
Angularjs自定义指令Directive详解
2017/05/27 Javascript
详解Node.js 命令行程序开发教程
2017/06/07 Javascript
JS模拟超市简易收银台小程序代码解析
2017/08/18 Javascript
Node.js 使用request模块下载文件的实例
2018/09/05 Javascript
webpack的 rquire.context用法实现工程自动化的方法
2020/02/07 Javascript
[00:32]2016完美“圣”典风云人物:Maybe宣传片
2016/12/05 DOTA
[48:56]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 VG vs KG
2018/03/31 DOTA
Python发送Email方法实例
2014/08/21 Python
python遍历序列enumerate函数浅析
2017/10/17 Python
Python中浅拷贝copy与深拷贝deepcopy的简单理解
2018/10/26 Python
Python生成一个迭代器的实操方法
2019/06/18 Python
如何修复使用 Python ORM 工具 SQLAlchemy 时的常见陷阱
2019/11/19 Python
Pytorch实现神经网络的分类方式
2020/01/08 Python
Python多重继承之菱形继承的实例详解
2020/02/12 Python
python 操作mysql数据中fetchone()和fetchall()方式
2020/05/15 Python
CSS3媒体查询Media Queries基础学习教程
2016/02/29 HTML / CSS
EVE LOM英国官网:全世界最好的洁面膏
2017/10/30 全球购物
跟单文员岗位职责
2014/01/03 职场文书
创优争先心得体会
2014/09/11 职场文书
2014党的群众路线教育实践活动学习心得体会
2014/10/31 职场文书
村干部任职承诺书
2015/01/21 职场文书
音乐教师求职信范文
2015/03/20 职场文书
筑梦中国心得体会
2016/01/18 职场文书
《打电话》教学反思
2016/02/22 职场文书