算法设计与分析:第二章 递归 2.2买商品

/*
一个顾客买了价值为x元的商品:并将y元的钱教给售货员。售货员希望用张数
最少的钱币找给顾客。找的钱最多需要以下6种币值:50,20,10,5,2,1

这道题目的关键在于:
设定一个数组b[6] = {50,20,10,5,2,1}
采用累除法,依次从数组b的高位到低位进行累加,如果当前钱币的值除了之后
有剩余,那么累加找钱币的个数,更新剩余需要找的钱,用下一个币值重复上述过程

输入:
1(买东西的钱) 100(付给的钱)
输出:
6 【1(50) + 2(20) + + 1(5)+ 2(2) = 6】
*/

#include <stdio.h>

int leastNumOfBackMoney(int iNeedBackMoney,int* pMoneyTypeArr,int iMoneyTypeNum)
{
	if(iNeedBackMoney <= 0)
	{
		return -1;
	}
	int iRet = 0;
	for(int i = 0 ; i < iMoneyTypeNum; i++)
	{
		int iNum = iNeedBackMoney / pMoneyTypeArr[i];
		iNeedBackMoney -= iNum * pMoneyTypeArr[i];
		iRet += iNum;
		if(iNeedBackMoney == 0)
		{
			break;
		}
	}
	return iRet;
}

void process()
{
	int iCost,iPay;
	int iMoneyTypeNum = 6;
	int iMoneyTypeArr[6] = {50,20,10,5,2,1}; 
	while(EOF != scanf("%d %d",&iCost,&iPay))
	{
		if(iCost > iPay)
		{
			break;
		}
		int iNeedBack = iPay - iCost;
		printf("%d\n",leastNumOfBackMoney(iNeedBack,iMoneyTypeArr,iMoneyTypeNum));
	}
}

int main(int argc,char* argv[])
{
	process();
	getchar();
	return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值