声明:
本文参考文章:http://www.bkjia.com/ASPjc/1025655.html
问题描述:
我们知道人民币有1、2、5、10、20、50、100这几种面值。现在给你n(1≤n≤250)元,让你计算换成用上面这些面额表示且总数不超过100张,共有几种。比如4元,能用4张1元、2张1元和1张2元、2张2元,三种表示方法。
输入:
输入有多组,每组一行,为一个整合n。输入以0结束。
输出:
输出该面额有几种表示方法。
思路:
这类问题的思路采用递归的思想的思考方式如下
对于某个数 X 能够由 A1、A2、A3的组合构成的问题,假设 f(x) 表示组合的个数。那么,f(x) 可以分解为存在 A1 的分解和不存在 A1 的分解
- 即 f(x) 可以表示为 X-A1 由 A1,A2,A3的组合(存在A1的分解),与 X 由 A2,A3的组合两部分(不存在A1的分解)
- 同理,对于递归过程的任意一个数,均可以用这种方式进行描述。但是,需要注意避免重复和截止条件
由此,我采用的解决代码日下:
#include <iostream>
using namespace std;
/*
日期:2016-02-17
作者:xieyun
要求:
找零钱
*/
int changeMoney(int money, int moneyNum, int index)
{
/*
输入:
money 需要拆分的现金
moneyNum 组合需要的纸币张数
index 用于指示拆分情况
返回:
组合数量
*/
int check[7] = {1, 2, 5, 10, 20, 50, 100};
if(money==0)
{
return 1;
}
if(money<0 || moneyNum<=0 || index>=7)
{
return 0;
}
return changeMoney(money-check[index], moneyNum-1, index) //存在A1的分解
+changeMoney(money, moneyNum, index+1); //不存在A1的分解
}
int main()
{
int presentMoney = 0;
while(1)
{
cin>>presentMoney;
if(presentMoney==0)
{
break;
}
cout<<changeMoney(presentMoney, 100, 0)<<endl;
}
return 0;
}