一、找零钱问题

例题1:

有 1 元,5元,10元,20元,100元,200元的钞票无穷多张。现在使用这些钞票支付X元,最少需要多少张钞票。

X = 628

最佳支付方法:

3张200块的,1张20块的,1张5块的,3张1块的

共需3+1+1+3 = 8张

直觉告诉我们:尽可能多的使用面值较大的钞票!

贪心法: 遵循某种规律,不断贪心的选取当前最优策略的算法设计方法。

分析:面额为1元、5元、10元、20元、100元、200元,任意面额是比自己小的面额的倍数关系。 所以当使用一张较大面额钞票时,若用较小面额钞票替换,一定需要更多的其他面额的钞票!

代码实现:

#include

#include

using namespace std;

int main(){

const int RMB[]= {200,100,20,10,5,1};

const int NUM = 6;//6种面值

int X = 628;

int count = 0;

for(int i= 0;i< NUM;i++){

int use = X / RMB[i];需要面额为RMB[i]的use张

count + = use;

X = X -RMB[i] * use;

printf("需要面额为%d 的%d张",RMB[i],use);

printf("剩余需要支付金额%d.\n",X);

}

printf("总共需要%d张\n",count);

return 0;

}

为何这么做一定是对的?

面额为 1元,5元,10元,20元,100元,200元,任意面额是比自己小的面额的倍数关系。

所以当使用一张较大面额钞票时,若使用较小面额钞票替换,一定需要更多的其他面额的钞票。

例如:

5=1+1+1+1+1

10=5+5

20=10+10

100=20+20+20+20+20

200=100+100

故:当前最优解即为全局最优解,贪心成立。

例题2:

有1元,5元,6元的纸币,现在用这些钞票支付K元,至少多少张纸币?

经我们分析,这种情况是不适合用贪心算法的,因为我们上面提供的贪心策略不是最优解。比如,要支付10元的话,按照上面的算法,至少需要1张6元的,4张1元的,而实际上最优的应该是2张5元的。

例题3:假设1元、2元、5元、10元、20元、50元、100元的纸币分别有a,b,c,d,e,f,g张。现在要用这些钱来支付m元,至少要用多少张纸币?如果能支付输出最少支付的张数,如果不能支付,输出-1。

#include

#include

using namespace std;

const int N=7;

int Count[N]={3,0,2,1,0,3,5}; //每种面值的数量

int Value[N]={1,2,5,10,20,50,100}; //面值

int solve(int money)

{

int num=0;

for(int i=N-1;i>=0;i--)

{

int c=min(money/Value[i],Count[i]);

money=money-c*Value[i];

num+=c;

}

if(money>0) num=-1;

return num;

}

int main()

{

int money;

cin>>money;

int res=solve(money);

if(res!=-1) cout<

else cout<

}

考虑一下,如果不同面值的钞票数量有限制,能不能直接用贪心算法。

返回目录:算法

上一篇:基本概念

Post Views:

278

c语言贪心算法零钱问题,贪心算法(2)——找零钱问题相关推荐

  1. java 动态规划找零钱_初探动态规划——LeetCode找零钱问题

    1.简介: 在leetcode上刷题的时候,遇到了一道找零钱的动态规划题,后台测试用例很变态,必须把算法优化的很好才能通过.也借此机会好好的研究了一下动态规划.在下小白一个,大神轻喷. 2.题目如下: ...

  2. 算法学习之路|在霍格沃茨找零钱

    如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 -- 就如海格告诉哈利的:"十七个银西可(Sickle)兑一个加隆(Galleon),二十九个纳特(Knut)兑一个西可,很容易.& ...

  3. 【广义找零钱问题】 贪心算法求解进制转换问题

    原题如下,怪我没读懂题意就开始写代码,曲解了题意,就写出个这样的奇葩进制来.但是运行结果与我的预期(实际上是对题的的错误理解)相符. 功能(与上图无关) 实现自定义独特进制的输出.类似于找零钱问题,见 ...

  4. 贪心算法1——找零钱问题

    贪心算法是一种不追求最优解,只希望找到较为满意解的方法.贪心算法省去了为找最优解要穷尽所有可能而必须耗费的大量时间,因此它一般可以快速得到比较满意的解. 贪心算法常以当前情况做最优选择,而不考虑各种可 ...

  5. 找零钱问题——贪心算法

    蓝桥杯--算法训练--找零钱 有n个人正在饭堂排队买海北鸡饭.每份海北鸡饭要25元.奇怪的是,每个人手里只有一张钞票(每张钞票的面值为25.50.100元),而且饭堂阿姨一开始没有任何零钱.请问饭堂阿 ...

  6. C++贪心算法求解找零钱问题(很形象)

    贪心算法求解找零钱问题 1.什么是贪心算法? 贪心算法是一种策略,总是做出在当前看来是最好的选择,总结出来几个字:寻找最优解 举个例子来说就是:"有一个只能往前走的果园,里边有各种水果让你免 ...

  7. c语言动态规划回溯的原理,「算法思想」分治、动态规划、回溯、贪心一锅炖...

    观感度:????? 口味:东北一锅出 烹饪时间:10min 本文已收录在Github github.com/Geekhyt,感谢Star. 数据结构与算法系列专栏第四弹来袭,往期专栏链接如下: 初学者 ...

  8. 数据结构与算法笔记:贪心策略之BSTBBST, Hashtable+Dictionary+Map, Priority Queue~Heap, Minium Spanning Tree

    BST & BBST BST(Binary Search Tree) 二叉搜索树,也就是使用二叉树来做查找 BBST(Balanced Binary Search Tree) 平衡二叉搜索树 ...

  9. 【算法学习】贪心算法

    参考算导第三版第16章 贪心算法 文章目录 1. 活动选择问题 1.1 活动选择问题的最优子结构 1.2 贪心选择 1.3 递归贪心算法 1.4 迭代贪心算法 2. 贪心算法原理 2.1 贪心选择性质 ...

最新文章

  1. 关于学习Python的一点学习总结(17->print打印参数及导入时重命名)
  2. QIIME 2教程. 26为QIIME 2开发新插件DevelopingPlugin(2021.2)
  3. oracle经常使用函数(1)
  4. yii redirect
  5. cartographer坐标系_cartographer 调参(1)-lua文件配置参考文档
  6. 代码安全检视方法有_在华为写了 13 年代码,都是宝贵的经验
  7. python文件数据类型_Python核心数据类型——文件
  8. java websocket注解_【websocket】spring boot 集成 websocket 的四种方式
  9. [转]Android应用开发提高系列(4)——Android动态加载(上)——加载未安装APK中的类...
  10. php的json_encode第二个参数学习及应用
  11. iDoubs的编译问题以及解决方案
  12. win10照片不能下一张的解决办法
  13. AutoCAD2010 激活不了,老是激活错误(0015.111)
  14. 鸿蒙系统只能从商城安装软件,鸿蒙系统安装不了第三方软件是为什么?鸿蒙系统怎么安装第三方app...
  15. mysql x86 x64_X86和X86_64和X64有什么区别?
  16. Wireshark的作用
  17. 能用计算机做什么作文,电脑的用途作文(九篇)
  18. 操作Redis客户端工具详解之功能介绍及配置
  19. web渗透测试----34、DoS和DDoS攻击
  20. 学计算机方法有哪些,初学者学习电脑方法有哪些

热门文章

  1. 计算机服务业结转成本,服务业结转成本如何做会计分录?
  2. cloc JAVA文件_Mac下统计任意文件夹中代码行数的工具——cloc
  3. 【缩点】SWUST 2014校赛 H:挖金子
  4. 2020年中国汽车电子软件行业发展现状、竞争格局及未来发展趋势分析,“软件定义汽车”重构汽车产业格局「图」
  5. Python中使用Tkinter 快速布局编写桌面GUI程序
  6. 线性布局 - Android开发
  7. 人民银行备案企业AAA信用评级7证包含哪些?
  8. android开发教程,android开发入门教程
  9. 蓝格赛中国启用Informatica PIM系统,加速多渠道战略和数字化转型
  10. 数控计算机软件的确认表怎么做,数控仿真系统操作(广数GSK980T)