题目描述:

想兑换100元零钱,有1元、2元、5元、10元四种面值,总有多少种兑换方法?

解题思路:

本题可以采用多种方法求解。最容易理解的应该就是暴力穷举和递归求解。那么本文主要介绍这两种解法。

暴力穷举:

100元换成1元,2元,5元,10元四种面值,那么考虑四种临界情况:
如果全部换成1元硬币, 则可换100个。
如果全部换成2元硬币, 则可换50个。
如果全部换成5元硬币, 则可换20 个。
如果全部换成10元硬币,则可换10个。
所以穷举范围就很清楚了,如果定义变量a,b,c,d分别表示1元,2元,3元,4元硬币的个数。那么:

0<=a<=100;               
0<=b<=50  ;              
0<=c<=20  ;               
0<=d<=10  ;                   

代码如下:

#include <stdio.h>
int main() 
{
	int g_count=0;
	int a,b,c,d;
	for(a=0; a<=100; a++)
	{
		for(b=0; b<=50; b++)
		{
			for(c=0; c<=20; c++)
			{
				for(d=0; d<=10; d++)
				{
					if(100==a+2*b+5*c+10*d)
					{
						g_count++;	
					}
				}
			}
		}
	}
	printf("%d\n",g_count);
	return 0;
}

递归算法:

#include <iostream>
using namespace std; 

const int N = 100;  
int dimes[] = {1, 2, 5, 10};  
int arr[N+1] = {1};  

int coinExchange(int n, int m) //递归方式实现,更好理解
{  
  if (n == 0)   //跳出递归的条件
        return 1;  
  if (n < 0 || m == 0)  
        return 0; 
 return (coinExchange(n, m-1) + coinExchange(n-dimes[m-1], m));  
  //分为两种情况:换取当前面值的情况 + 没有换取当前面值的情况
  //如果没有换当前硬币,那么是多少?加上,如果换了当前硬币,总值减少,此时又是多少种兑换方法?
}
int main()
{
  int num=coinExchange(N, 4); 
  cout<<num<<endl; 
  return 0; 
}