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_15_作用域分配与变量访问规则,再送个闭包
Oct 20 Javascript
js中eval()函数和trim()去掉字符串左右空格应用
Feb 02 Javascript
window.location.reload()方法刷新页面弹出要再次显示该网页对话框
Apr 24 Javascript
jQuery之选择组件的深入解析
Jun 19 Javascript
jquery+ajax+C#实现无刷新操作数据库数据的简单实例
Feb 08 Javascript
javasctipt如何显示几分钟前、几天前等
Apr 30 Javascript
使用struts2+Ajax+jquery验证用户名是否已被注册
Mar 22 Javascript
Bootstrap风格的zTree右键菜单
Feb 17 Javascript
JS基于面向对象实现的多个倒计时器功能示例
Feb 28 Javascript
Mongoose实现虚拟字段查询的方法详解
Aug 15 Javascript
解决vue prop传值default属性如何使用,为何不生效的问题
Sep 21 Javascript
js实现网页随机验证码
Oct 19 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面试常用算法(推荐)
2016/07/22 PHP
PHP中in_array的隐式转换的解决方法
2018/03/06 PHP
深入理解JavaScript系列(17):面向对象编程之概论详细介绍
2015/03/04 Javascript
原生JavaScript实现滚动条效果
2020/03/24 Javascript
浅谈JavaScript中的分支结构
2016/07/01 Javascript
初识简单却不失优雅的Vue.js
2016/09/12 Javascript
ThinkJS中如何使用MongoDB的CURD操作
2016/12/13 Javascript
原生js实现瀑布流布局
2017/03/08 Javascript
angular.js指令中的controller、compile与link函数的不同之处
2017/05/10 Javascript
vue 2.0封装model组件的方法
2017/08/03 Javascript
layui-laydate时间日历控件使用方法详解
2018/11/15 Javascript
JS监听滚动和id自动定位滚动
2018/12/18 Javascript
基于vue+uniapp直播项目实现uni-app仿抖音/陌陌直播室功能
2019/11/12 Javascript
Node.js API详解之 console模块用法详解
2020/05/12 Javascript
vue浏览器返回监听的具体步骤
2021/02/03 Vue.js
[42:23]完美世界DOTA2联赛PWL S3 Forest vs Rebirth 第二场 12.10
2020/12/13 DOTA
python中map()与zip()操作方法
2016/02/27 Python
Python面向对象程序设计之继承与多继承用法分析
2018/07/13 Python
Python Django框架模板渲染功能示例
2019/11/08 Python
django 模型字段设置默认值代码
2020/07/15 Python
详解Flask前后端分离项目案例
2020/07/24 Python
利用python批量爬取百度任意类别的图片的实现方法
2020/10/07 Python
多个版本的python共存时使用pip的正确做法
2020/10/26 Python
HTML5 canvas基本绘图之绘制线段
2016/06/27 HTML / CSS
KIKO MILANO英国官网:意大利知名化妆品和护肤品品牌
2017/09/25 全球购物
Etam俄罗斯:法国女士内衣和家居服网上商店
2019/10/30 全球购物
哥德堡通行证:Gothenburg Pass
2019/12/09 全球购物
Molton Brown美国官网:奢华美容、香水、沐浴和身体护理
2020/09/02 全球购物
物理专业大学生职业生涯规划书
2014/02/07 职场文书
服务承诺书怎么写
2014/05/24 职场文书
竞选学习委员演讲稿
2014/09/01 职场文书
我爱我班主题班会
2015/08/13 职场文书
2019员工保密协议书(3篇)
2019/09/23 职场文书
分析设计模式之模板方法Java实现
2021/06/23 Java/Android
CSS实现章节添加自增序号的方法
2021/06/23 HTML / CSS
在redisCluster中模糊获取key方式
2021/07/09 Redis