【穷举】零钱换整钱

小明手中有硬币,小红手中有若干张10元的纸币。已知 1 角硬币厚 1.8mm,5 角硬币厚 1.5mm,1 元硬币厚 2.0mm 。小红拿出若干张10元的纸币,小明要将 1 角的硬币放成一摞,将 5 角的硬币放成一摞,将 1 元的硬币放成一摞,如果 3 摞硬币一样高,且三摞硬币的金额之和正好等于小红要求的面值,则双方交换,否则没有办法交换。

输入: 
    小红希望交换几张10元的纸币

输出: 
    1 角的数量,5 角的数量,1元的数量

测试输入期待的输出时间限制内存限制额外进程
测试用例 1以文本方式显示
  1. 8↵
以文本方式显示
  1. 50,60,45↵
1秒64M0
测试用例 2以文本方式显示
  1. 4↵
以文本方式显示
  1. No change.↵
1秒64M0

思路:

    看到题目,我们可以很自然地想到穷举法,用三个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");
}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值