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 相关文章推荐
jQuery查询数据返回object和字符串影响原因是什么
Aug 09 Javascript
使用jquery的ajax需要注意的地方dataType的设置
Aug 12 Javascript
javascript自启动函数的问题探讨
Oct 05 Javascript
js中实现多态采用和继承类似的方法
Aug 22 Javascript
vue构建单页面应用实战
Apr 10 Javascript
node.js调用Chrome浏览器打开链接地址的方法
May 17 Javascript
解决vue项目报错webpackJsonp is not defined问题
Mar 14 Javascript
详解JSON Web Token 入门教程
Jul 30 Javascript
vue2中,根据list的id进入对应的详情页并修改title方法
Aug 24 Javascript
如何解决webpack-dev-server代理常切换问题
Jan 09 Javascript
详解ES6 CLASS在微信小程序中的应用实例
Apr 24 Javascript
JavaScript函数重载操作实例浅析
May 02 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/11/10 PHP
PHP 模拟$_PUT实现代码
2010/03/15 PHP
php中filter_input函数用法分析
2014/11/15 PHP
[企业公众号]升级到[企业微信]之后发送消息失败的解决方法
2017/06/30 PHP
PHP底层运行机制与工作原理详解
2020/07/31 PHP
js实现的早期滑动门菜单效果代码
2015/08/27 Javascript
纯JS代码实现气泡效果
2016/05/04 Javascript
jquery模拟多级复选框效果的简单实例
2016/06/08 Javascript
JS继承之借用构造函数继承和组合继承
2016/09/07 Javascript
angularJS Provider、factory、service详解及实例代码
2016/09/21 Javascript
JavaScript仿微博发布信息案例
2016/11/16 Javascript
Vue实现选择城市功能
2017/05/27 Javascript
three.js中文文档学习之通过模块导入
2017/11/20 Javascript
基于ssm框架实现layui分页效果
2019/07/27 Javascript
Vue的props父传子的示例代码
2020/05/20 Javascript
token 机制和实现方式
2020/12/15 Javascript
[53:43]VP vs NewBee Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
python备份文件的脚本
2008/08/11 Python
在Linux上安装Python的Flask框架和创建第一个app实例的教程
2015/03/30 Python
举例详解Python中循环语句的嵌套使用
2015/05/14 Python
批量获取及验证HTTP代理的Python脚本
2017/04/23 Python
python中print()函数的“,”与java中System.out.print()函数中的“+”功能详解
2017/11/24 Python
利用Python实现在同一网络中的本地文件共享方法
2018/06/04 Python
基于Python在MacOS上安装robotframework-ride
2018/12/28 Python
python flask web服务实现更换默认端口和IP的方法
2019/07/26 Python
详解pandas中iloc, loc和ix的区别和联系
2020/03/09 Python
python+flask编写一个简单的登录接口
2020/11/13 Python
聊聊Python pandas 中loc函数的使用,及跟iloc的区别说明
2021/03/03 Python
澳大利亚免息网上购物:Shop Zero
2016/09/17 全球购物
Giglio英国站:意大利奢侈品购物网
2018/03/06 全球购物
澳大利亚百货商店中销量第一的商务衬衫品牌:Van Heusen
2018/07/26 全球购物
西部世纪.net笔试题面试题
2014/04/03 面试题
医药学专业大学生职业生涯规划书论文
2014/01/21 职场文书
家电业务员岗位职责
2014/03/10 职场文书
党支部评议意见
2015/06/02 职场文书
农村房屋租赁合同(范本)
2019/07/23 职场文书