[循环枚举]换零钱

换零钱

题目描述

现有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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值