找零钱问题
(ChangeNote.cpp)
【题目描述】
人民币中10圆以下的零钞可以由5圆、1圆、5角、1角、5分和1分组成。编写一个给出找零钱时纸币和硬币数目最少的方案的程序。例如,找零钱6.78圆的最佳方案是5圆1张、1圆1个、5角1个、1角2个、5分1个和1分3个。
【解题思路】
从面值最大的零钞开始搜索,只要零钱总额超过其值,该钞需要一张/个,否则比较下一个稍小的零钞。上述策略,在剩余零钱总额(原零钱总额扣除那张/个的余额)不为零时重复进行,直到余额为零。
【输入】
输入ChangeNote.in中包含1个表示零钱的实数。
【输出】
输出ChangeNote.out如输出样例,为最佳找零方案。
【输入输出样例1】
ChangeNote.in |
ChangeNote.out |
6.78 |
伍圆: 1 壹圆: 1 伍角: 1 壹角: 2 伍分: 1 壹分: 3 |
#include
#include
int main()
{ int sc[6]={500, 100, 50, 10, 5, 1}; // 6种零钞的面值,单位是分
int num[6]={0}; // 存储找零最优方案,即6种零钞的数目
float m;
int mint; // 存放当前零钱面值总额
int i;
scanf("%f",&m); // 输入零钱金额,单位是元
mint=int(m*100+0.5);
for(i=0;i<6;i++)
{
num[i]=mint/sc[i];
mint-=sc[i]*num[i];
}
for(i=0; i<6; i++)
if(num[i]!=0)
switch(i)
{ case 0: printf(" 伍圆: %d\n",num[0]); break;
case 1: printf(" 壹圆: %d\n",num[1]); break;
case 2: printf(" 伍角: %d\n",num[2]); break;
case 3: printf(" 壹角: %d\n",num[3]); break;
case 4: printf(" 伍分: %d\n",num[4]); break;
default: printf(" 壹分: %d\n",num[5]);
}
return 0;
}