不同钱币组合方案问题
Given an infinite number of quarters(25 cents),dimes(10 cents),nickle(5 cents) and pennies(1 cent),
write code to calculate the number of ways of representing n cents.
基本思想:考虑25cents 10cents 5cents 1cents 个数构成的解空间
代码实现1:
- int counts_1(int n)
- {
- if(n <= 0) return 0;
- const int units = 4;
- int nUnit[units] = {25,10,5,1};
- return recursive(n,0,0,nUnit,units);
- }
- int recursive(int n, int curSum, int level, int *pUnit, int units)
- {
- int cnts = 0;
- if(level <= units)
- {
- if(curSum == n)
- {
- cnts = 1;
- }
- else
- {
- for(int i = 0; i*pUnit[level] <= n-curSum; ++i)
- {
- cnts += recursive(n,curSum+i*pUnit[level],level+1,pUnit,units);
- }
- }
- }
- return cnts;
- }
代码实现2(实现思想同上)
- //实现代码2
- int counts_2(int n)
- {
- if(n <= 0) return 0;
- return makeChange(n,25);
- }
- int makeChange(int n, int denom)
- {
- int next_denom = 0;
- switch(denom)
- {
- case 25:
- next_denom = 10;
- break;
- case 10:
- next_denom = 5;
- break;
- case 5:
- next_denom = 1;
- break;
- case 1:
- return 1;
- }
- int ways = 0;
- for(int i = 0; i*denom <= n; ++i)
- {
- ways += makeChange(n-i*denom,next_denom);
- }
- return ways;
- }