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获得keycode的示例代码
Dec 30 Javascript
jquery原创弹出层折叠效果点击折叠弹出一个层
Mar 12 Javascript
JS+CSS实现感应鼠标渐变显示DIV层的方法
Feb 20 Javascript
JavaScript中利用各种循环进行遍历的方式总结
Nov 10 Javascript
跟我学习javascript的异步脚本加载
Nov 20 Javascript
WebView启动支付宝客户端支付失败的问题小结
Jan 11 Javascript
vue.js 1.x与2.0中js实时监听input值的变化
Mar 15 Javascript
layui实现table加载的示例代码
Aug 14 Javascript
ExtJs使用自定义插件动态保存表头配置(隐藏或显示)
Sep 25 Javascript
js实现web调用摄像头 js截取视频画面
Apr 21 Javascript
vue 使用 sortable 实现 el-table 拖拽排序功能
Dec 26 Vue.js
为什么node.js不适合大型项目
Apr 28 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中的Class的几点个人看法
2006/10/09 PHP
某大型网络公司应聘时的笔试题目附答案
2008/03/27 PHP
PHP 模拟$_PUT实现代码
2010/03/15 PHP
深入理解php的MySQL连接类
2013/06/07 PHP
Zend Framework教程之Zend_Db_Table用法详解
2016/03/21 PHP
PHP7安装Redis扩展教程【Linux与Windows平台】
2016/09/30 PHP
PHP实现基本留言板功能原理与步骤详解
2020/03/26 PHP
jquery $.ajax入门应用二
2008/11/19 Javascript
Node.js开发指南中的简单实例(mysql版)
2013/09/17 Javascript
JavaScript中的函数重载深入理解
2014/08/04 Javascript
一个不错的仿携程自定义数据下拉选择select
2014/09/01 Javascript
jQuery实现提示密码强度的代码
2015/07/15 Javascript
Jquery实现瀑布流布局(备有详细注释)
2015/07/31 Javascript
jquery-mobile表单的创建方法详解
2016/11/23 Javascript
bootstrap表单按回车会自动刷新页面的解决办法
2017/03/08 Javascript
HTML的select控件美化
2017/03/27 Javascript
ES6新特性之函数的扩展实例详解
2017/04/01 Javascript
JavaScript实现反转字符串的方法详解
2017/04/27 Javascript
微信小程序开发之IOS和Android兼容的问题
2017/09/26 Javascript
Vue项目History模式404问题解决方法
2018/10/31 Javascript
js实现搜索提示框效果
2020/09/05 Javascript
Vue实现简易购物车页面
2020/12/30 Vue.js
简介二分查找算法与相关的Python实现示例
2015/08/26 Python
Tesserocr库的正确安装方式
2018/10/19 Python
在pycharm中python切换解释器失败的解决方法
2018/10/29 Python
python提取包含关键字的整行数据方法
2018/12/11 Python
python实现猜拳游戏
2020/03/04 Python
腾讯技术类校园招聘笔试试题
2014/05/06 面试题
Shell如何接收变量输入
2016/08/06 面试题
个人贷款收入证明
2014/10/26 职场文书
答谢词范文
2015/01/05 职场文书
初中政教处工作总结
2015/08/12 职场文书
中小学教师继续教育心得体会
2016/01/19 职场文书
人生感悟经典句子
2019/08/20 职场文书
windows11怎么查看自己安装的版本号? win11版本号的查看方法
2021/11/21 数码科技
Python编程中内置的NotImplemented类型的用法
2022/03/23 Python