题目
纸币的组成问题
描述
用1元,2元,5元,10元,20元,50元和100元的纸币组成n元,共有多少种情况。
分析
此题可使用递归解决
将组成的单数纸币保存到数组,放入如下:
int a[6] = {1, 5, 10, 20, 50, 100};
由前j种组成的纸币n包括两种:
一种是一定包括第j种纸币;即getSumCount(n-a[j], j)
另一种是一定不包括第j种(即由0到j-1种)组成,即getSumCount(n, j-1)
例如:
150元,使用j[5]=100之前的所有币种的组成个数包括:
使用j[5],即getSumCount(n-a[j], j)=getSumCount(150-100, 5)
不使用j[5],即getSumCount(n, j-1)=getSumCount(150, 4)
总的组成个数为:
getSumCount(150, 5)=getSumCount(150-100, 5) + getSumCount(150, 4)
代码
#include<iostream>
using namespace std;
/*
1, 5, 10, 20, 50, 100
*/
int a[6] = {1, 5, 10, 20, 50, 100};
/*
参数n:组成的数n
参数j:使用数据a[6]中的前j+1个数组成n
返回值:返回所有的组成总数
*/
long getSumCount(int n, int j){
if(n<0) return 0;
else if(n>=5 && j>=1){
return getSumCount(n, j-1)+getSumCount(n-a[j], j);
}else{
return 1;
}
}
int main(){
std::cout << "n=1:: " << getSumCount(1, 5) << std::endl;
std::cout << "n=6:: " << getSumCount(6, 5) << std::endl;
std::cout << "n=10:: " << getSumCount(10, 5) << std::endl;
std::cout << "n=15:: " << getSumCount(15, 5) << std::endl;
std::cout << "n=17:: " << getSumCount(17, 5) << std::endl;
std::cout << "n=20:: " << getSumCount(20, 5) << std::endl;
std::cout << "n=100:: " << getSumCount(100, 5) << std::endl;
std::cout << "n=171:: " << getSumCount(171, 5) << std::endl;
std::cout << "n=1000:: " << getSumCount(1000, 5) << std::endl;
return 0;
}