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 相关文章推荐
初学prototype,发个JS接受URL参数的代码
Sep 25 Javascript
使用JavaScript实现Java的List功能(实例讲解)
Nov 07 Javascript
如何书写高质量jQuery代码(使用jquery性能问题)
Jun 30 Javascript
AngularJS中的Directive实现延迟加载
Jan 25 Javascript
jquery实现输入框实时输入触发事件代码
Dec 21 Javascript
js判断用户是输入的地址请求的路径(实例讲解)
Jul 18 Javascript
使用重写url机制实现验证码换一张功能
Aug 01 Javascript
Vue-Router模式和钩子的用法
Feb 28 Javascript
Less 安装及基本用法
May 05 Javascript
解决IOS端微信H5页面软键盘弹起后页面下方留白的问题
Jun 05 Javascript
使用vuex较为优雅的实现一个购物车功能的示例代码
Dec 09 Javascript
VUE之图片Base64编码使用ElementUI组件上传
Apr 09 Vue.js
解决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
BBS(php &amp; mysql)完整版(六)
2006/10/09 PHP
解析PHP中一些可能会被忽略的问题
2013/06/21 PHP
ThinkPHP中的三大自动简介
2014/08/22 PHP
Windows下的PHP 5.3.x安装 Zend Guard Loader教程
2014/09/06 PHP
php实现无限级分类查询(递归、非递归)
2016/03/10 PHP
javascript实现页面内关键词高亮显示代码
2014/04/03 Javascript
js 动态修改css文件的方法
2014/08/05 Javascript
DOM节点删除函数removeChild()用法实例
2015/01/12 Javascript
JavaScript中匿名函数用法实例
2015/03/23 Javascript
js获取新浪天气接口的实现代码
2016/06/06 Javascript
javascript弹出窗口中增加确定取消按钮
2016/06/24 Javascript
jQuery实现鼠标经过时高亮,同时其他同级元素变暗的效果
2016/09/18 Javascript
在html中引入外部js文件,并调用带参函数的方法
2016/10/31 Javascript
微信小程序 wx.uploadFile无法上传解决办法
2016/12/14 Javascript
浅谈vue-router路由切换 组件重用挖下的坑
2019/11/01 Javascript
JavaScript 中的无穷数(Infinity)详解
2020/02/13 Javascript
[03:42]2014DOTA2西雅图国际邀请赛 Navi战队巡礼
2014/07/07 DOTA
Python中的lstrip()方法使用简介
2015/05/19 Python
Python实现求笛卡尔乘积的方法
2017/09/16 Python
Python 循环语句之 while,for语句详解
2018/04/23 Python
Python实现输出某区间范围内全部素数的方法
2018/05/02 Python
Python处理时间日期坐标轴过程详解
2019/06/25 Python
Python callable内置函数原理解析
2020/03/05 Python
Pandas之缺失数据的实现
2021/01/06 Python
html5构建触屏网站之touch事件介绍
2013/01/07 HTML / CSS
Lookfantastic台湾:英国彩妆美发保养购物网
2018/03/26 全球购物
斯洛伐克电子产品购物网站:DATART
2020/04/05 全球购物
Java程序员面试90题
2013/10/19 面试题
工程师求职简历的自我评价分享
2013/10/10 职场文书
财务会计专业毕业生自荐信
2013/10/19 职场文书
幼儿园消防演练方案
2014/02/13 职场文书
一分钟演讲稿
2014/04/30 职场文书
病人写给医生的感谢信
2015/01/23 职场文书
行政处罚事先告知书
2015/07/01 职场文书
婚礼长辈答谢词
2015/09/29 职场文书
Vue的生命周期一起来看看
2022/02/24 Vue.js