ACM蓝桥杯之换硬币问题

题目描述:

想兑换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; 
}

猜你喜欢

转载自www.cnblogs.com/smartZhou/p/10292382.html