|
10鱼币
/*
在英国,货币是由英镑 £,便士 p 构成的。一共有八种钱币在流通:
1p, 2p, 5p, 10p, 20p, 50p, £1 (100p) 和 £2 (200p).
要构造 £2 可以用如下方法:
1×£1 + 1×50p + 2×20p + 1×5p + 1×2p + 3×1p
允许使用任意数目的钱币,一共有多少种构造 £2 的方法?
*/
//总体思路是判断一种货币可能出现的情况(主函数判断哪种货币,从大到小)
//利用递归完成,200-该货币(余额)的情况
#include<stdio.h>
int array[8]={1,2,5,10,20,50,100,200};
int count=0;//定义一个全局变量,用来统计数量
void Count(int m,int sum,int *array,int a)
{
if(array[m]!=array[0])//没有 只剩下一种货币供选择。
{
if(a==1)
{
for(int k=1;k<=sum/array[m];k++)//第一次不能取0;其他时候可以取。
{
if(sum-k*array[m]==0)//如果余额为零
{
count++;
return;
}
else//对余额情况进行递归
{
Count(m-1,sum-k*array[m],array,0);
}
}
}
else
{
for(int k=0;k<=sum/array[m];k++)//第一次不能取0;其他时候可以取。
{
if(sum-k*array[m]==0)
{
count++;
return;
}
else
{
Count(m-1,sum-k*array[m],array,0);
}
}
}
}
else
{
count++;
return;
}
}
int main(void)
{
for(int i=7;i>=1;i--)
{
Count(i,200,array,1);
}
count++;//把全部是1的加入
printf("一共有%d种构造 面额为200 的方法",count);
return 0;
}
你的代码大体上是正确的,主要思路就是递归处理各种货币组合的问题。这里我对你的代码做了一些微小的修改,以增加代码的可读性,并修复了一些可能导致错误的地方。这是修改后的代码:
#include<stdio.h>
int array[8] = {1, 2, 5, 10, 20, 50, 100, 200};
int count = 0;
void Count(int m, int sum, int *array)
{
if(m >= 0) {
for(int k = 0; k <= sum / array[m]; k++) {
if(sum - k * array[m] == 0) {
count++;
}
else {
Count(m - 1, sum - k * array[m], array);
}
}
}
}
int main(void)
{
Count(7, 200, array);
printf("一共有%d种构造 面额为200 的方法", count);
return 0;
}
这个程序的主要工作就是在函数 Count 中进行,它采用了递归的方式处理所有可能的货币组合。注意,在递归调用 Count 函数时,我并没有用到你在原始代码中的 a 参数。对于每一种面值的货币,我们都尝试用不同数量的它来组合,如果剩余的面额(sum - k * array[m])等于0,就说明我们找到了一种组合方式,计数器 count 就会加1。如果剩余的面额不等于0,我们就递归地尝试用更小的面值的货币来组合剩余的面额。
这个程序运行的效率可能不会很高,因为它需要尝试所有可能的货币组合。如果面额较大,可能会花费较长的时间。但是对于面额为200的情况,这个程序应该是可以在合理的时间内得出结果的。
|
最佳答案
查看完整内容
你的代码大体上是正确的,主要思路就是递归处理各种货币组合的问题。这里我对你的代码做了一些微小的修改,以增加代码的可读性,并修复了一些可能导致错误的地方。这是修改后的代码:
这个程序的主要工作就是在函数 Count 中进行,它采用了递归的方式处理所有可能的货币组合。注意,在递归调用 Count 函数时,我并没有用到你在原始代码中的 a 参数。对于每一种面值的货币,我们都尝试用不同数量的它来组合,如果剩余的 ...
|