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所必须要知道的一些
Mar 07 Javascript
javascript 鼠标滚轮事件
Apr 09 Javascript
用JavaScript隐藏控件的方法
Sep 21 Javascript
jquery中this的使用说明
Sep 06 Javascript
基于jquery的监控数据是否发生改变
Apr 11 Javascript
jQuery trigger()方法用法介绍
Jan 13 Javascript
jQuery实现的AJAX简单弹出层效果代码
Nov 26 Javascript
canvas实现手机端用来上传用户头像的代码
Oct 20 Javascript
React中的refs的使用教程
Feb 13 Javascript
D3.js实现拓扑图的示例代码
Jun 30 Javascript
基于webpack4.X从零搭建React脚手架的方法步骤
Dec 23 Javascript
layui-table表复选框勾选的所有行数据获取的例子
Sep 13 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经典实用正则表达式小结
2017/05/04 PHP
监控 url fragment变化的js代码
2010/04/19 Javascript
为JavaScript添加重载函数的辅助方法
2010/07/04 Javascript
25个好玩的JavaScript小游戏分享
2011/04/22 Javascript
基于jQuery的图片左右无缝滚动插件
2012/05/23 Javascript
基于jQuery.validate及Bootstrap的tooltip开发气泡样式的表单校验组件思路详解
2016/07/18 Javascript
JS打印组合功能
2016/08/04 Javascript
AngularJS通过$location获取及改变当前页面的URL
2016/09/23 Javascript
解决ie11 SCRIPT5011:不能执行已释放Script的代码问题
2019/05/05 Javascript
JS浮点数运算结果不精确的Bug解决
2019/08/01 Javascript
详解JavaScript中的链式调用
2020/11/27 Javascript
[01:04:05]VG vs Newbee 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
[01:36:19]Secret vs NB 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
使用Python+Splinter自动刷新抢12306火车票
2018/01/03 Python
Python读取Json字典写入Excel表格的方法
2018/01/03 Python
Python3 导入上级目录中的模块实例
2019/02/16 Python
浅谈Python小波分析库Pywavelets的一点使用心得
2019/07/09 Python
python创建与遍历List二维列表的方法
2019/08/16 Python
详解python播放音频的三种方法
2019/09/23 Python
基于python实现雪花算法过程详解
2019/11/16 Python
Python利用matplotlib绘制约数个数统计图示例
2019/11/26 Python
Django密码存储策略分析
2020/01/09 Python
keras实现基于孪生网络的图片相似度计算方式
2020/06/11 Python
基于Python的一个自动录入表格的小程序
2020/08/05 Python
html5使用canvas画一条线
2014/12/15 HTML / CSS
计算机专业个人求职信范例
2013/09/23 职场文书
党校培训自我鉴定范文
2014/03/20 职场文书
《美丽的南沙群岛》教学反思
2014/04/27 职场文书
中学教师暑期培训方案
2014/08/27 职场文书
学校运动会广播稿100条
2014/09/14 职场文书
代收款委托书范本
2014/10/01 职场文书
2014年反洗钱工作总结
2014/11/22 职场文书
会计继续教育培训心得体会
2016/01/19 职场文书
使用react+redux实现计数器功能及遇到问题
2021/06/02 Javascript
pytorch finetuning 自己的图片进行训练操作
2021/06/05 Python
mysq启动失败问题及场景分析
2021/07/15 MySQL