本题可以采用多种方法求解。最容易理解的应该就是暴力穷举和递归求解。那么本文主要介绍这两种解法。
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;
}
原文:https://www.cnblogs.com/smartZhou/p/10292382.html