同学找我写了一个简单的找零的贪婪算法,中间遇到了一个不了解的知识点,所以顺便记录下来吧
问题描述:
日常交易中找遇到找零钱时,您可能希望最大限度地减少给客户找零的硬币数量,以免您用完了硬币或惹恼客户!。幸运的是,计算机科学已经为收银员提供了最小化硬币数量的方法:贪婪算法。
贪婪算法是一种“在寻找答案时始终采用最佳局部解决方案的算法”。贪婪算法为某些优化问题找到了整体或全局最优解决方案,但对于某些其他问题,只能找到次优的满意解决方案。
假设收银员的抽屉里有用不完的四种硬币:25¢,10¢,5¢和1¢,他需要找给客户找零。如何决定将哪些硬币交给顾客呢?如果你欠某个顾客41美分,那么局部最佳解决方案是拿出一个25美分。 这会将41¢问题减少到16¢问题,因为41 - 25 = 16.也就是说,余数是一个类似但更小的问题。毋庸置疑,另一个25美分的价格会太大,所以你会转向拿出一个10美分,问题的尺度减少到了6美分的问题。这时,你在拿出一个5¢,最后一个1¢,问题就解决了。客户收到一个25¢,10¢,5¢和1¢:总共四个硬币。
实现细节
程序命名为 cash.c。实现的功能是先询问用户找零的数目,然后打印出组成这些零钱的最少的硬币数目。
- 定义并调用函数 get_positive_float 从用户那里得到一个正的浮点数,用 printf 把答案打印出来。假设收银员的抽屉里只有用不完的四种硬币:25¢,10¢,5¢和1¢,
- 如果顾客交给收银员$10买 25¢ 的报纸,需要找零$9.75,运行程序时输入9.75.
- 用户的输入如果不是合法的浮点数,或者是负的浮点数,程序应该不断提醒用户输入正的浮点数。
- 最后输出一个整数(最少的硬币数量)加回车。
- 注意浮点数内在的不精确特性。计算找零方案时可以考虑把输入的元转化成分 即把输入的数字从 float 转化位 int,防止不精确带来的误差。
- 计算完分后,需要调用定义在库math.h中的函数 round,. 将输入四升五入至最近的整数。如:运行输入找零 0.20元, 下面的语句可以找零的元转换为分:
- int coins = round(dollars * 100);
这样可以把0.20转换为 20.
代码如下:
#include <stdio.h>
int get_positive_float();
int main(){
int a[]={
25,10,5,1};
int b[]={
0,0,0,0};
bool flag;
int value1=get_positive_float();
for(;