[循环枚举]换零钱
换零钱
题目描述
现有m 张面值100元,n 张面值50元的人民币,想换成面值为1元,2元,5元三种面值的人民币,兑换的结果必须含有1元,2元和5元这三种面值人民币(即,三种币值中,任意一种不能为0 张),计算有多少种换法,输出其值。
关于输入
m 和 n 在1行内输入,以空格间隔。
关于输出
有多少种换法
例子输入
0 1
例子输出
106
提示信息
程序不优化,可能会超时(Time out)
解题分析
定义变量需要时间,每一步的计算也需要时间,所以尽可能地减少计算。
程序采用了暴力枚举的方式来解决这个问题。首先,我计算了可以兑换的最大数量的1元、2元和5元的人民币。然后,我遍历了所有可能的组合,检查每一种组合是否满足总金额不超过原始的金额。
具体来说,我的程序首先读取输入的面值数量,然后计算出可以兑换的最大数量的1元、2元和5元的人民币。然后,它使用两个嵌套循环遍历所有可能的1元和2元的数量。对于每种组合,它检查5元的数量是否满足总金额不超过原始的金额。如果满足,它就增加换法的计数。最后,它输出总的换法数量。
这个解决方案的主要优点是它的简单和直观。然而,它的主要缺点是它的效率很低,特别是当面值数量非常大时。因为它需要遍历所有可能的组合,所以它的时间复杂度是O(n^2),其中n是面值数量。这可能会导致程序在处理大规模数据时超时。
代码实现
#include <stdio.h>
#include <math.h>
int a1,a2,a3;
int main(void) { int m,n; scanf("%d%d",&m,&n);int count=0;a1=(m*20+n*10-1),a2=(m*50+n*25-3),a3=(100*m+50*n-1);for(int i=1;i<=a1;i++)for(int j=1;j<=a2;j++){if(5*i+2*j<=a3){count++;}}printf("%d\n",count);return 0;
}