超市找零问题(应该如何设计算法呢,谢谢大家)

sz1988 2012-05-08 02:31:32
题目如下:


某超市收银员每天都面对很多零钱,但是真正在需要给顾客找零时,又经常会不够用,不是少一元的,就是少5角的,请大家帮收银员MM找到一个最优的找零算法,让手上零钱得到充分利用。
找零原则:
1) 根据系统全部零钱内钱币的信息,按钱币总张数最少的原则进行退币。
2) 零钱总数:50元的10张,20元的20张,10元的50张,5元的100张,1元的100张,5角的200张,1角的500张,一角以下的可以丢弃。


输入

收到的钱数(单位:元)

输出

1) 找零成功后返回各种人民币的张数,格式需要和示例中保持一致
2) 零钱不足时返回失败 the operate is fail。

样例输入

2151

样例输出

the operate is fail

提示

#include
//#include
//#include
#include "string.h"
int g_num_50yuan = 10;
int g_num_20yuan = 20;
int g_num_10yuan = 50;
int g_num_5yuan = 100;
int g_num_1yuan = 100;
int g_num_5jiao = 200;
int g_num_1jiao = 500;
int Process(float sum);
int main(void)
{
float sum = 0;
int nRet = 0;
//printf("please input numbers!\n");
nRet = scanf("%f",&sum);
//printf("input numbers is %f .\n",sum);
if (0 == nRet || sum == 0)
{
//printf("input numbers is Invalid .\n");
return 0;
}
//考生需要实现
printf("\n");
return 0;
}

用例1:
输入:
1235
输出:
the results are num_50=10 num_20=20 num_10=33 num_5=1 num_1=0 num_0.5=0 num_0.1=0

用例2:
输入:
156
输出:
the results are num_50=3 num_20=0 num_10=0 num_5=1 num_1=1 num_0.5=0 num_0.1=0

用例3:
输入:
589.2
输出:
the results are num_50=10 num_20=4 num_10=0 num_5=1 num_1=4 num_0.5=0 num_0.1=2
...全文
2285 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
DataChat.Club 2012-05-08
  • 打赏
  • 举报
回复
因为 while (sum > 50.0 && num_50 < g_num_50yuan) 里面比较的时候忘记加等号了,就加了个0.009这个题目要求可以忽略的数,如果加上等号,就不用加这个0.009了。

 while (sum >= 50.0 && num_50 < g_num_50yuan)



[Quote=引用 6 楼 的回复:]

请问 sum = sum + 0.009; 是什么意思呢? 谢谢您O(∩_∩)O~

引用 5 楼 的回复:

C/C++ code

int Process(float sum)
{

int num_50 = 0, num_20 = 0, num_10 = 0, num_5 = 0, num_1 = 0, num_0_5 = 0, num_0_1 = 0;
sum = ……
[/Quote]
sz1988 2012-05-08
  • 打赏
  • 举报
回复
请问 sum = sum + 0.009; 是什么意思呢? 谢谢您O(∩_∩)O~

[Quote=引用 5 楼 的回复:]

C/C++ code

int Process(float sum)
{

int num_50 = 0, num_20 = 0, num_10 = 0, num_5 = 0, num_1 = 0, num_0_5 = 0, num_0_1 = 0;
sum = sum + 0.009;
if (sum > 2150.0)
{
print……
[/Quote]
DataChat.Club 2012-05-08
  • 打赏
  • 举报
回复

int Process(float sum)
{

int num_50 = 0, num_20 = 0, num_10 = 0, num_5 = 0, num_1 = 0, num_0_5 = 0, num_0_1 = 0;
sum = sum + 0.009;
if (sum > 2150.0)
{
printf("the operate is fail");
return 1;
}
while (sum > 50.0 && num_50 < g_num_50yuan)
{
num_50++;
sum = sum - 50;
}
while (sum >20.0 && num_20 < g_num_20yuan)
{
num_20++;
sum = sum - 20;
}
while (sum > 10.0 && num_10 < g_num_10yuan)
{
num_10++;
sum = sum - 20;
}
while (sum > 5.0 && num_5 < g_num_5yuan)
{
num_5++;
sum = sum - 5;
}
while (sum > 1.0 && num_1 < g_num_1yuan)
{
num_1++;
sum = sum - 1;
}
while (sum > 0.5 && num_0_5 < g_num_5jiao)
{
num_0_5++;
sum = sum - 0.5;
}
while (sum > 0.1 && num_0_1 < g_num_1jiao)
{
num_0_1++;
sum = sum - 0.1;
}
printf("the results are num_50=%d num_20=%d num_10=%d num_5=%d num_1=%d num_0.5=%d num_0.1=%d", num_50, num_20, num_10, num_5, num_1, num_0_5, num_0_1);

return 0;
}
W170532934 2012-05-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

按钱币总张数最少的原则进行退币
那就先除50再20再10这样依次算就好了
[/Quote]
贪心算法
sz1988 2012-05-08
  • 打赏
  • 举报
回复
但是零钱的数量有限制啊,具体应该怎么实现呢?[Quote=引用 1 楼 的回复:]

按钱币总张数最少的原则进行退币
那就先除50再20再10这样依次算就好了
[/Quote]
沙勒巴基 2012-05-08
  • 打赏
  • 举报
回复
楼上正解。。。。
Red_angelX 2012-05-08
  • 打赏
  • 举报
回复
按钱币总张数最少的原则进行退币
那就先除50再20再10这样依次算就好了

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧