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 相关文章推荐
创建一个复制UBB软件信息的链接或按钮的js代码
Jan 06 Javascript
javascript IFrame 强制刷新代码
Jul 23 Javascript
JS上传图片前的限制包括(jpg jpg gif及大小高宽)等
Dec 19 Javascript
JS获取屏幕,浏览器窗口大小,网页高度宽度(实现代码)
Dec 17 Javascript
对js关键字命名的疑问介绍
Apr 25 Javascript
jQuery中:checkbox选择器用法实例
Jan 03 Javascript
20个最常见的jQuery面试问题及答案
May 23 jQuery
Vue CLI3创建项目部署到Tomcat 使用ngrok映射到外网
May 16 Javascript
vuex存值与取值的实例
Nov 06 Javascript
Vue.directive 实现元素scroll逻辑复用
Nov 29 Javascript
Nuxt的动态路由和参数校验操作
Nov 09 Javascript
vue登录页实现使用cookie记住7天密码功能的方法
Feb 18 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
排序算法之PHP版快速排序、冒泡排序
2014/04/09 PHP
php、java、android、ios通用的3des方法(推荐)
2016/09/09 PHP
ie 调试javascript的工具
2009/04/29 Javascript
jQuery 源代码显示控件 (Ajax加载方式).
2009/05/18 Javascript
location.href 在IE6中不跳转的解决方法与推荐使用代码
2010/07/08 Javascript
actionscript与javascript的区别
2011/05/25 Javascript
jquery formValidator插件ajax验证 内容不做任何修改再离开提示错误的bug解决方法
2013/01/04 Javascript
javascript parseInt() 函数的进制转换注意细节
2013/01/08 Javascript
javaScript中两个等于号和三个等于号之间的区别介绍
2014/06/27 Javascript
director.js实现前端路由使用实例
2015/02/03 Javascript
Javascript writable特性介绍
2015/02/27 Javascript
jQuery获得子元素个数的方法
2015/04/14 Javascript
ajax+jQuery实现级联显示地址的方法
2015/05/06 Javascript
微信小程序录音与播放录音功能
2017/12/25 Javascript
JavaScript对象的浅拷贝与深拷贝实例分析
2018/07/25 Javascript
详解Next.js页面渲染的优化方案
2019/01/27 Javascript
使用Vue父子组件通信实现todolist的功能示例代码
2019/04/11 Javascript
小程序异步问题之多个网络请求依次执行并依次收集请求结果
2019/05/05 Javascript
JavaScript使用localStorage存储数据
2019/09/25 Javascript
vue中的使用token的方法示例
2020/03/10 Javascript
JavaScript定时器使用方法详解
2020/03/26 Javascript
Element DateTimePicker日期时间选择器的使用示例
2020/07/27 Javascript
VUE中鼠标滚轮使div左右滚动的方法详解
2020/12/14 Vue.js
window下eclipse安装python插件教程
2017/04/24 Python
Python OpenCV获取视频的方法
2018/02/28 Python
python smtplib模块自动收发邮件功能(二)
2018/05/22 Python
python pytest进阶之fixture详解
2019/06/27 Python
python GUI库图形界面开发之PyQt5线程类QThread详细使用方法
2020/02/26 Python
pycharm导入源码的具体步骤
2020/08/04 Python
英国领先的杂志订阅网站:Magazine.co.uk
2018/01/25 全球购物
英国演唱会订票网站:Ticket Selection
2018/03/27 全球购物
宣传口号大全
2014/06/16 职场文书
2014年电话客服工作总结
2014/12/09 职场文书
《颐和园》教学反思
2016/02/19 职场文书
详解Python牛顿插值法
2021/05/11 Python
vue项目proxyTable配置和部署服务器
2022/04/14 Vue.js