算法基础–优惠券问题(贪心算法)

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

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

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

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

多组输入输出,读到s=0时结束 输入可以有多个测试样例,每个测试由两行组成。
其中第一行包含一个整数P,表示商品的价格,1≤P≤10000;输入P为0时表示结束。
第二行包含若干整数,使用空格分割。其中第一个整数N(1≤N≤20)表示有多少种代金券,其后跟随M个整数,表示手中持有的代金券面额(1≤N≤1000),每种代金券数量不限。

输出描述:

找到最少张数的代金券,使其面额恰好等于商品价格。输出所使用的代金券数量;
如果有多个最优解,只输出其中一种即可;
如果无解,则需输出“Impossible”。

贪心算法的含义我就不去总结了。毕竟自己也不太理解到位。但在这个例子中我明白了解题的思路。分享给大家,大家结合别人的贪心算法总结一起使用吧。
话不多说,先给代码:

//以上代码为方面提交进行的输入处理
var num = 65;   //组合总金额
var type = 4;   //代金券种类
var money = [50,30,20,5]; //代金券面额
function getResult(num, type, money) {var dp = [];dp[0] = 0;for(var i=1;i<=num;i++){var arr = [];for(var j=0;j<money.length;j++){ if(i>=money[j]){                    //i >= 5时,可进入判定arr.push(dp[i-money[j]] + 1);    //dp[i] = infinity}}dp[i] = Math.min(...arr);}return dp[num] === Infinity?"Impossible":dp[num];
}

分析
arr数组的值存储的是每一个代金券可搭配的金额的代金券种类:

1 [ ]
2 [ ]
3 [ ]
4 [ ]
5 [ 1 ]
10 [ 2 ]
15 [ 3 ]20 [ 1 ]
20 [ 1, 4 ]25 [ 2 ]
25 [ 2, 2 ]30 [ 1 ]
30 [ 1, 3 ]
30 [ 1, 3, 3 ]35 [ 2 ]
35 [ 2, 4 ]
35 [ 2, 4, 2 ]40 [ 3 ]
40 [ 3, 2 ]
40 [ 3, 2, 3 ]45 [ 4 ]
45 [ 4, 3 ]
45 [ 4, 3, 3 ]50 [ 1 ]
50 [ 1, 2 ]
50 [ 1, 2, 2 ]
50 [ 1, 2, 2, 4 ]55 [ 2 ]
55 [ 2, 3 ]
55 [ 2, 3, 3 ]
55 [ 2, 3, 3, 2 ]60 [ 3 ]
60 [ 3, 2 ]
60 [ 3, 2, 3 ]
60 [ 3, 2, 3, 3 ]65 [ 4 ]
65 [ 4, 3 ]
65 [ 4, 3, 4 ]
65 [ 4, 3, 4, 3 ]

dp数组会存储每一个<=65的数值的代金券搭配的数目的最小值。如果为Infinity则输出Impossible。在本例中,dp数组的值:

dp[1]: Infinity
dp[2]: Infinity
dp[3]: Infinity
dp[4]: Infinity
dp[5]: 1
dp[6]: Infinity
dp[7]: Infinity
dp[8]: Infinity
dp[9]: Infinity
dp[10]: 2
dp[11]: Infinity
dp[12]: Infinity
dp[13]: Infinity
dp[14]: Infinity
dp[15]: 3
dp[16]: Infinity
dp[17]: Infinity
dp[18]: Infinity
dp[19]: Infinity
dp[20]: 1
dp[21]: Infinity
dp[22]: Infinity
dp[23]: Infinity
dp[24]: Infinity
dp[25]: 2
dp[26]: Infinity
dp[27]: Infinity
dp[28]: Infinity
dp[29]: Infinity
dp[30]: 1
dp[31]: Infinity
dp[32]: Infinity
dp[33]: Infinity
dp[34]: Infinity
dp[35]: 2
dp[36]: Infinity
dp[37]: Infinity
dp[38]: Infinity
dp[39]: Infinity
dp[40]: 2
dp[41]: Infinity
dp[42]: Infinity
dp[43]: Infinity
dp[44]: Infinity
dp[45]: 3
dp[46]: Infinity
dp[47]: Infinity
dp[48]: Infinity
dp[49]: Infinity
dp[50]: 1
dp[51]: Infinity
dp[52]: Infinity
dp[53]: Infinity
dp[54]: Infinity
dp[55]: 2
dp[56]: Infinity
dp[57]: Infinity
dp[58]: Infinity
dp[59]: Infinity
dp[60]: 2
dp[61]: Infinity
dp[62]: Infinity
dp[63]: Infinity
dp[64]: Infinity
dp[65]: 3
            if (i >= money[j]) {                    //i >= 5时,可进入判定arr.push(dp[i - money[j]] + 1);    //dp[i] = infinity}//在这个代码块中,判断 i 数值是否可以由代金券搭配出来,当 ‘dp[i - money[j]]’的值不是‘Infinity’时,可搭配。

这样说就基本清楚了。
说的很简陋,主要看代码,和输出结果分析。主要思想就是‘大事化小,小事化了

算法基础--优惠券问题(贪心算法)相关推荐

  1. java贪心算法 区间调度_贪心算法-区间调度问题解之证明(示例代码)

    一.贪心算法 定义:一个算法是贪心算法,如果它是通过一些小的步骤来一个求解,并且在每一步根据局部情况选择一个决定,使得某些主要的指标得到优化. 二.区间调度问题 1. 问题:我们有一组需求{1,2,3 ...

  2. (十四)算法设计思想之“贪心算法”

    算法设计思想之"贪心算法" 贪心算法是什么 LeetCode:455.分饼干 LeetCode:122.买卖股票的最佳时机II 思考题 贪心算法是什么 贪心算法是算法设计中的一种方 ...

  3. 疯子的算法总结(四)贪心算法

    一.贪心算法 解决最优化问题的算法一般包含一系列的步骤,每一步都有若干的选择.对于很多最优化问题,只需要采用简单的贪心算法就可以解决,而不需要采用动态规划方法.贪心算法使所做的局部选择看起来都是当前最 ...

  4. _28LeetCode代码随想录算法训练营第二十八天-贪心算法 | 122.买卖股票的最佳时机II 、55.跳跃游戏、45.跳跃游戏II

    _28LeetCode代码随想录算法训练营第二十八天-贪心算法 | 122.买卖股票的最佳时机II .55.跳跃游戏.45.跳跃游戏II 题目列表 122.买卖股票的最佳时机II 55.跳跃游戏 45 ...

  5. 算法——人的天性贪心算法

    相应的练习代码:https://github.com/liuxuan320/Algorithm_Exercises 0. 写在前面 说起贪心算法,可能是我们最为熟悉的算法了.正如我标题所说的,贪心算法 ...

  6. 算法系列(二):贪心算法--Huffman编码

    算法系列(二):贪心算法--Huffman编码 一.分析 问题描述: 哈夫曼编码是广泛地用于数据文件压缩的十分有效的编码方法.其压缩率通常在20%-90%之间.哈夫曼编码算法使用字符在文件中出现的频率 ...

  7. _32LeetCode代码随想录算法训练营第三十二天-贪心算法 | 738.单调递增的数字 、714.买卖股票的最佳时机含手续费、968.监控二叉树

    _32LeetCode代码随想录算法训练营第三十二天-贪心算法 | 738.单调递增的数字 .714.买卖股票的最佳时机含手续费.968.监控二叉树 题目列表 738.单调递增的数字 714.买卖股票 ...

  8. 算法基础-十大排序算法及其优化(文末有抽奖福利哦)

    算法基础-十大排序算法及其优化 算法基础-十大排序算法及其优化 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Kw1LA5Q4-1607527572080)(/uplo ...

  9. 提高篇 第一部分 基础算法 第1章 贪心算法

    一本通提高篇在线提交地址 一本通提高篇在线提交地址_老象的专栏-CSDN博客 [ 贪心 进阶总结 ][ 来自一本通提高篇 ] [ 贪心 进阶总结 ][ 来自一本通提高篇 ]_violinwang-CS ...

最新文章

  1. 【Python】将字典(dict)转化为Dataframe
  2. linux驱动 打印变量,linux驱动 内核函数 变量 宏定义
  3. POJ - 1961 最小循环节
  4. Python的第一个程序 Hello world
  5. 【jzoj】2018.1.30NOIP普及组——模拟赛D组
  6. 使用HTTPS和OAuth 2.0保护服务到服务的Spring微服务
  7. 用Keras搭建神经网络 简单模版(三)—— CNN 卷积神经网络(手写数字图片识别)...
  8. Android_WakeLock使用
  9. 【转】 HMC与VIOS对新LPAR提供存储与网络虚拟化的支持
  10. Java后端技术面试汇总(第一套)
  11. Qt Quick Dialogs
  12. 【免费】如何轻松的从音乐网站下载自己喜欢的mp3音乐?
  13. 在线制作网站sitemap并提交
  14. deepFM model
  15. 师傅带徒弟学:Python Web之Flask框架-关东升-专题视频课程
  16. 欧洲共同语言参考标准英语c1,美国小学英语3年级语言知识对标欧洲共同语言参考标准CEFR...
  17. python初中可以学吗_初中学历零基础想转行Python,能否学会?Python难吗?
  18. PMSM 控制技术探究与仿真1:三相PMSM的数学建模与坐标变换
  19. 不看后悔系列|超详细亚马逊listing优化细节
  20. ROS-3DSLAM(15):视觉部分visual estimator 第九节 factor3

热门文章

  1. JAVA之缓冲流,转换流和序列化流
  2. 2021最新 SpringBoot面试题精选(附刷题小程序)
  3. 汇编指令和机器码的对应表
  4. 抛硬币(不连续正面的所有情况)
  5. 使用树莓派基于FFmpeg推流视频和摄像头到B站直播间
  6. 台式电脑显示无法自动修复此计算机,笔记本电脑启动修复无法自动修复此计算机怎么办...
  7. python绘制灰度直方图_python+opencv 灰度直方图及其二值化
  8. 平价降噪耳机哪个牌子好?便宜又好用的降噪耳机推荐
  9. 什么是算数运算c语言,第二种是C语言的算术运算.ppt
  10. 微信小程序实例 - 手机号归属地查询