小明手中有硬币,小红手中有若干张10元的纸币。已知 1 角硬币厚 1.8mm,5 角硬币厚 1.5mm,1 元硬币厚 2.0mm 。小红拿出若干张10元的纸币,小明要将 1 角的硬币放成一摞,将 5 角的硬币放成一摞,将 1 元的硬币放成一摞,如果 3 摞硬币一样高,且三摞硬币的金额之和正好等于小红要求的面值,则双方交换,否则没有办法交换。
输入:
小红希望交换几张10元的纸币
输出:
1 角的数量,5 角的数量,1元的数量
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 2 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
思路:
看到题目,我们可以很自然地想到穷举法,用三个for循环嵌套,直到试出符合要求的三个数值,否则输出无法找零。
不过这样做不够优化,假如我们输入的10元钱币数量很多,那相应的,找零所需的三种硬币的数量也会很多。若使用这种方法,我们的应对措施只有增大每次for循环的次数。如果每次for循环次数设为500,那么三层嵌套下来就是500*500*500次,这显然是个很大的数字,程序很容易超时。
一般情况下,我们面对题目,想得越多,程序越简洁。由于三种硬币的厚度必须相等才能输出,所以他们的数量关系其实满足一个恒定的比值,即10:12:9。那么我们仅用一层for循环就可以让程序寻找是否有满足条件的数值了,大大减少了上一种方法中的许多“无用功”。
#include <stdio.h>
int main(){
int n=0,OneY=0,FiveJ=0,OneJ=0;
scanf("%d",&n);
for (int i = 0; i < 1000; ++i)
{
OneJ=10*i;
FiveJ=12*i;
OneY=9*i;
if(OneY+0.5*FiveJ+0.1*OneJ==10*n)
{
printf("%d,%d,%d\n",OneJ,FiveJ,OneY);
return 0;
}
}
printf("No change.\n");
}