硬币零钱算法
⑴ 找零钱问题的贪心算法
问题描述:
当前有面值分别为2角5分,1角,5分,1分的硬币,请给出找n分钱的最佳方案(要求找出的硬币数目最少)
问题分析:
根据常识,我们到店里买东西找钱时,老板总是先给我们最大面值的,要是不够再找面值小一点的,直到找满为止。如果老板都给你找分数的或者几角的,那你肯定不干,另外,他也可能没有那么多零碎的钱给你找。其实这就是一个典型的贪心选择问题。
问题的算法设计与实现:
先举个例子,假如老板要找给我99分钱,他有上面的面值分别为25,10,5,1的硬币数,为了找给我最少的硬币数,那么他是不是该这样找呢,先看看该找多少个25分的, 99/25=3,好像是3个,要是4个的话,我们还得再给老板一个1分的,我不干,那么老板只能给我3个25分,由于还少给我24,所以还得给我2个10分的和4个1分。
具体实现
//找零钱算法
//By falcon
//输入:数组m,依次存放从大到小排列的面值数,n为需要找的钱数,单位全部为分
//输出:数组num,对照数组m中的面值存放不同面值的硬币的个数,即找钱方案
⑵ 算法:找零钱,有4种硬币1,2,5,10,将X和Y换成零钱,求所用的最少钱数 如:8,9,输出4(1,2,2,5)
这个算法相对较为简单,使用大面值硬币优先使用即可。
void getCoinList(int bigMoney)
{
int coinValues[] = {10, 5, 2, 1};
int coins[4] = {0};
int totalCoins = 0;
int surplusMoney = bigMoney;
int i = 0, j = 0;
for (i = 0; i < 4; i++)
{
coins[i] = surplusMoney / coinValues[i];
totalCoins += coins[i];
surplusMoney = bigMoney % coinValues[i];
}
printf("%d(", totalCoins);
for(i = 3; i >= 0; i--)
for(j = 0; j < coins[i]; j++)
{
if (--totalCoins > 0)
printf("%d ,", coinValues[i]);
else
printf("%d", coinValues[i]);
}
printf(")", coinValues[i]);
}
⑶ 编程:换零钱。把一元钱全兑换成1分2分5分硬币,有多少种兑换方法包括全1分或者全5分
这程序很好写,不过关键是看算法设计得怎么样,是不是最优的。我只写一个最简单的,自己尝试优化下,这也是编程的乐趣之一。
int fCent; //5分个数
int tCent; //2分个数
int oCent; //1分个数
int count=0; //兑换方法个数
for(fCent=0;fCent<=20;fCent++)
{
for (tCent=0;tCent<=50;tCent++)
{
oCent=100-5*fCent-2*tCent;
if(oCent>=0) count++;
}
}
把上面程序放到main中就可以了,你想要的输出就是count的值。还有看你说的题意,是否2分的不能是0个,如果有这个要求第二个for循环,也就是tCent 从1开始就可以了。
自己再去优化吧。
⑷ 将一笔零钱(大于8分,小于1元, 精确到分)换成5分、2分和1分的硬币。
题目要求“各类硬币数量依次从大到小的顺序”,注意数量是从大到小, 所以原程序 for 循环的初始条件和步长不对,下面是修改后的代码:
#include "stdio.h"
int main(void)
{
int count, fen1, fen2, fen5, money;
int repeat, ri;
scanf("%d", &repeat);
for(ri = 1; ri <= repeat; ri++){
scanf("%d", &money);
count=0;
for (fen5 = money /5; fen5 >= 1; fen5--){
for (fen2 = money /2; fen2 >= 1; fen2--){
for (fen1 = money; fen1 >= 1; fen1--){
if(fen1+2*fen2+5*fen5==money){
printf("fen5:%d,fen2:%d,fen1:%d,total:%d\n",fen5, fen2, fen1, fen5+fen2+fen1);
count++;}
}}}
printf("count = %d\n", count);
}
}
⑸ 换零钱问题。将一元钱换成1分,2分,或5分的零钱有多少换法。vb编程
题目我没怎么看懂,比如说你写的i+j+l==k,那题目中的40放在哪里?
另外我要说的一个大问题,也是就是float的用法,float的值是小数,电脑的算法是近似值。
举个例子,
float
a
=
1;
b
=
a/10;
按道理b此时是0.1,但是你输出的由于编译器的不同有可能是
0.10000000000001,也有可能是0.09999999999999.也有可能是0.1。当出现这种情况,你的if中的判断就永远不会实现。
所以你的if可以比较大小判断,比如if(x==5)写成((x>4.9999)&&(x<5.00001))或者不要出现float,所有的数值乘以10,把小数去除。
⑹ 小花有一个一块钱硬币,要换零钱,最小值为一角钱,有几种换法
1、10个一角
2、两个5角
3、一个5角,5个1角
⑺ 深圳招商银行存零钱硬币怎么收费
深圳招商银行存零钱硬币收费标准是每50枚收取1块钱清点费。根据查询相关信息显示,招商银行的收费标准把硬币和纸币区分开来,硬币每50枚收取1块钱清点费,纸币每1000张收取10元清点费。招商银行,1987年成立于深圳蛇口,是中国境内第一家完全由企业法人持股的股份制商业银行,也是国家从体制外推动银行业改革的第一家试点银行。
⑻ 换零钱.把一元钱全兑换成硬币,有多少种兑换方法
硬币分为1分 5分 1角 5角 以1分算起 1元就是 100个1分 20个5分 10个1角 2个5角
然后就是四层循环的穷举法了
⑼ 用1分,2分和5分硬币凑成一元钱的方法有多少种
不知道有没有限制一定要有这3种硬币呢?如果这三种硬币必须至少用一枚的话,算法如下:
设x个1分,y个2分,z个5分,且xyz都是正自然数
x+2y+5z=100
19>=z>=1
z=1时 x+2y=95 x>=1,且x是奇数;2y<=94,且y是整数,所以有47种
z=2时 x+2y=90 1<=y<=44 同理,有44种
z=3时 x+2y=85 1<=y<=42 同理,有42种
z=4时 x+2y=80 1<=y<=39 同理,有39种
z=5时 x+2y=75 1<=y<=37 同理,有37种
……
这个方法好笨,要算19次……不过我暂时想不出更好的方法
但有个规律就是个数依次-3,-2,-3,-2,-3……
⑽ C语言换零钱:把一元人民币兑换成硬币,共有多少种兑换方法
#include<stdio.h>
#define SUM 10//定义总的钱
#define ONE 1//定义一角
#define FIVE 5//定义五角
int main()
{
int i;
int count = 0;//初始化为0
//控制循环数量,考虑兑换不会超过SUM/FIVE,
//所以可以以此控制循环次数,加快运行速度
for(i=0;i<=SUM/FIVE;i++)
if((SUM - FIVE*i)>=0)//判断,只要剩下的是大于等于0的硬币数,即满足要求
count++;
printf("共有%d种兑换方法\n",count);
return 0;
}