您的位置:首页 > 其它

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

2015-08-04 01:10 211 查看
/*
一个顾客买了价值为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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: