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 相关文章推荐
javascript优先加载笔记代码
Sep 30 Javascript
Three.js源码阅读笔记(物体是如何组织的)
Dec 27 Javascript
jQuery关于导航条背景切换效果实现示例
Sep 04 Javascript
javascript实现分栏显示小技巧附图
Oct 13 Javascript
jquery ajax局部加载方法详解(实现代码)
May 12 Javascript
Vue.Draggable实现拖拽效果
Jul 29 Javascript
Vue实现百度下拉提示搜索功能
Jun 21 Javascript
详解webpack-dev-server使用方法
Sep 14 Javascript
一篇文章,教你学会Vue CLI 插件开发
Apr 17 Javascript
微信小程序实现元素渐入渐出动画效果封装方法
May 18 Javascript
js+canvas实现五子棋小游戏
Aug 02 Javascript
vue 页面跳转的实现方式
Jan 12 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
Oracle 常见问题解答
2006/10/09 PHP
国外PHP程序员的13个好习惯小结
2012/02/20 PHP
php获得网站访问统计信息类Compete API用法实例
2015/04/02 PHP
php文件上传 你真的掌握了吗
2016/11/28 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
laravel 获取当前url的别名方法
2019/10/11 PHP
js宝典学习笔记(上)
2007/01/10 Javascript
Jquey拖拽控件Draggable使用方法(asp.net环境)
2010/09/28 Javascript
JQuery开发的数独游戏代码
2010/10/29 Javascript
基于jquery的地址栏射击游戏代码
2011/03/10 Javascript
基于jquery点击自以外任意处,关闭自身的代码
2012/02/10 Javascript
js+xml生成级联下拉框代码
2012/07/24 Javascript
JS去除空格和换行的正则表达式(推荐)
2016/06/14 Javascript
jQuery和hwSlider实现内容响应式可触控滑动切换效果附源码下载(二)
2016/06/22 Javascript
JavaScript九九乘法口诀表的简单实现
2016/10/04 Javascript
JavaScript中的子窗口与父窗口的互相调用问题
2017/02/08 Javascript
AngularJS封装$http.post()实例详解
2017/05/06 Javascript
nginx配置React静态页面的方法教程
2017/11/03 Javascript
详解VUE 数组更新
2017/12/16 Javascript
js判断输入框不能为空格或null值的实现方法
2018/03/02 Javascript
详解小程序如何改变onLoad的执行时机
2019/11/01 Javascript
JS禁用右键、禁用Ctrl+u、禁用Ctrl+s、禁用F12的实现代码
2020/12/01 Javascript
python生成器的使用方法
2013/11/21 Python
Python中的map()函数和reduce()函数的用法
2015/04/27 Python
如何给Python代码进行加密
2020/01/10 Python
python实现图像拼接
2020/03/05 Python
2019年Java 最常见的 面试题
2016/10/19 面试题
自我鉴定200字
2013/10/28 职场文书
超市5.1促销活动
2014/01/15 职场文书
汽车销售员如何做职业生涯规划
2014/02/16 职场文书
社会工作专业求职信
2014/07/15 职场文书
一般党员对照检查材料
2014/09/24 职场文书
作弊检讨书
2015/01/27 职场文书
生日祝酒词大全
2015/08/10 职场文书
Python实现列表拼接和去重的三种方式
2021/07/02 Python
Nginx设置HTTPS的方法步骤 443证书配置方法
2022/03/21 Servers