前言

最近在牛客网上刷题,遇到一题代金券的问题,花了我一下午时间研究(我才刚开始复习算法和数据结构),写此文章来记录一下。

题目传送门:https://www.nowcoder.com/question/next?pid=21910781&qid=894518&tid=31674041 第六题

问题

近期某商场由于周年庆,开启了“0元购”活动。活动中,消费者可以通过组合手中的代金券,实现0元购买指定商品。

聪明的小团想要用算法来帮助他快速计算:对于指定价格的商品,使用代金券凑出其价格即可,但所使用的代金券总面额不可超过商品价格。由于代金券数量有限,使用较少的代金券张数则可以实现价值最大化,即最佳优惠。

假设现有100元的商品,而代金券有50元、30元、20元、5元四种,则最佳优惠是两张50元面额的代金券;而如果现有65元的商品,则最佳优惠是两张30元代金券以及一张5元代金券。

请你帮助小团使用一段代码来实现代金券计算。

思考

蠢蠢的我第一反应就是使用贪心算法(毕竟我还没开始复习),但是后来发现通过率不高才想起贪心算法算出最优解是有条件的,这题并不满足。(贪心算法是啥?搜其他文章去吧)所以要用动态规划(看了很多其他文章才发现的,其实这类问题叫做找零问题)。有很多解法都是用其他语言的,然后尤为大佬是用js写的,但是没有任何注释解释,看得我一脸懵逼。

然后我就通过其他语言弄懂了流程后,再结合JS完成了代码

代码

var target_money = 3;
var price_list = [2, 5, 7, 20, 50];
console.log(fn(target_money, price_list));function fn(tg, pl) {var dp = [];// 初始化矩阵,令每种钱解决0元的都为0张// 初始化顶栏for (let i = 0; i < pl.length; i++) {dp.push([0])}// 初始化左栏for (let i = 1; i <= tg; i++) {if (i % pl[0] == 0) dp[0][i] = parseInt(i / pl[0]);// pl[0]为最小的,除不尽用无限大else dp[0][i] = Infinity;}// 开始绘制整张表for (let i = 1; i <= tg; i++) {for (let j = 1; j < pl.length; j++) {// 用不到pl[j]金额的if (i < pl[j]) dp[j][i] = dp[j - 1][i];// 金额相等一张就够了else if (i == pl[j]) dp[j][i] = 1;else {// 左边的var left = dp[j - 1][i];// 上方的var up = dp[j][i - pl[j]] + 1;// 取较小的存入dp[j][i] = left < up ? left : up;}}}var res = dp[pl.length - 1][tg]// console.log(dp)return res == Infinity ? "Impossible" : res;
}

解释

动态规划是要创建一张表,dp是一个二维数组,横向表示代金券的种类,纵向代表需要组成的金额数。用 dp(j,i)来表示使用前j种代金券来构成i元的所需的代金券数量。横向的代金券金额需要按照小到大的顺序排列,纵向是0到目标金额。

dp(j , i)的值等于dp(j-1,i)和dp(j,i - pl[j]) + 1 中小的一个,前一个代表不用金额种类j的代金券来解决金额i的,最少张数,后一个代表金额i减掉当前代金券金额后,用当前金额的代金券解决的最少张数。因为减掉了当前代金券金额,相当于使用了一张当前代金券,所以后面要加一。

初始化:用前j种代价券来解决0元的情况,结果都为0张。用第0种代金券来处理0到tg金额只有两种情况,可以除得尽,那就填入张数。除不尽的话,因为题目要求所以置为js中的无穷大Infinity。相当于dp表的最左边和最上边都有值了,后面的数都是比较左边一位和上边的数。

结束

才发现前端也要学好算法,好好加油吧。

最少代金券问题之JavaScript解法相关推荐

  1. 微信开发(一):用JSAPI做微信支付+微信卡包(代金券)

    做微信支付前期准备: 1,服务好开通微信支付. 2,公众账号ID:AppId. 3,公众账号密钥:AppSecret. 4,微信支付密钥:Key. 第一步:获取用户信息并跳转到需要微信支付的页面 pu ...

  2. L2-3.名人堂与代金券

    题目内容 对于在中国大学MOOC(http://www.icourse163.org/) 学习"数据结构"课程的学生,想要获得一张合格证书,总评成绩必须达到 60 分及以上,并且有 ...

  3. 如何同时使用阿里云代金券和优惠券

    登陆官网,我们这里以ECS为例,上面的代金券码购买其它产品也可以使用! 进入管理控制台,确认代金券的使用范围和条件,这个时候如果你没有登录,他自动把你带向登录界面,如果你已经登录会直接进入配置页面! ...

  4. 美团刷题 代金券组合

    近期某商场由于周年庆,开启了"0元购"活动.活动中,消费者可以通过组合手中的代金券,实现0元购买指定商品. 聪明的小团想要用算法来帮助他快速计算:对于指定价格的商品,使用代金券凑出 ...

  5. 微信支付代金券开发包分享

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 1. 前言 距离上次发原创分享应该有 12 天了,最近忙 ...

  6. EasyWechat中代金券的发放总结

    前言 最近接了一个任务,要给别的商户发送一个代金券,由于我使用的laravel,所以我很自然的composer了overtrue的easywechat来做这个,但是我发现看遍文档并没有发现发送代金券的 ...

  7. [转]JS脚本抢腾讯云学生1元代金券

    转自:http://blog.csdn.net/lkxlaz/article/details/54909397 今天抢代金券,在网上看到的,虽然脚本很easy,但也mark一下吧. //make th ...

  8. 7-11 名人堂与代金券 (25 分)

    7-11 名人堂与代金券 (25 分) 对于在中国大学MOOC(http://www.icourse163.org/ )学习"数据结构"课程的学生,想要获得一张合格证书,总评成绩必 ...

  9. leetcode 5 Longest Palindromic Substring Java JavaScript解法

    题目详情 Given a string s, find the longest palindromic substring in s. You may assume that the maximum ...

最新文章

  1. Java中BigDecimal工具类(支持空值运算版)
  2. 面试官问:能否模拟实现JS的new操作符
  3. python教程:datetime与字符串互转
  4. 近期吉他练习曲目《爱的罗曼史》,安排每天晚上睡觉前练习1小时!
  5. Redis分布锁原理简介和实现过程
  6. HTML textarea控件
  7. AngularJS + Java---前台网页与后台数据库传递数据 基本结构
  8. 高仿阴阳师官网轮播图效果的jQuery插件
  9. mpu6050 z轴校准_大渡口区上门校正检定量具外校-第三方检测计量出校准证书
  10. 美国插画家Mike Bear作品欣赏
  11. python3 文件处理
  12. Apache Flink 简单安装
  13. 相机姿态估计(六)--EPnP
  14. Android 自动接听 adb,GitHub - AndroidMsky/RootPlay: 安卓手机秒变网络摄像头,自动接起QQ视频。欢迎star,fork,Issues。...
  15. usb网卡android驱动win7+64,万能USB驱动 for win7 64bit v2017.11.15.955
  16. 服务器登录显示sa登录失败,U8应用服务器配置时提示登录SA失败发现是由于未能找到存储过程‘sp_password’的解决方案...
  17. 一个文字类RPG游戏框架(走过路过别错过)C++
  18. 矩阵求和及Kadane算法
  19. android studio 下拉菜单,怎么在android studio中使用Spinner实现一个下拉菜单
  20. 维基百科创建和百度百科建立有何不同?

热门文章

  1. ​无线ap的概念,和无线路由器有什么区别
  2. radio按扭设置只读_RadioButton控件
  3. 关于手机微信的聊天记录在手机中的存放位置及关系
  4. Python 爬虫瞎玩系列(1) —— Bilibili的前100个上古巨坟考古
  5. 【IOS学习之常见问题】 App上架之发布App到Appstore
  6. 一个注释甜美的分页插件(原生js)
  7. win10 docker运行sqlserver容器报错:This program requires a machine with at least 2000 megabytes of memory.
  8. 网络名词术语解析(路由,路由器,交换机等)
  9. 毕业设计 基于WEB的网上购物系统的设计与实现
  10. 比较全面的freemarker语法总结