[CCF1034]钞票兑换

题目描述

将任意给定的整百元钞票,兑换成10元、20元、50元小钞票形式。输出兑换方案总数。

输入

输入需要兑换的钞票总数n。

输出

输出方案总数。

样例输入

100

样例输出

10

数据范围限制

100<=n<=1000000


常规0

#include <stdio.h>
#include <stdlib.h>
int main(){
    int i,a,b,c,sum=0;
    scanf("%d",&i);
    for(a=0;a<=i/50;a++){
        for(b=0;b<=i/20;b++){
            for(c=0;c<=i/10;c++){
                if(a*50+b*20+c*10==i){
                    sum++;
                }
            }
        }
    }
    printf("%d",sum);
    return 0;
}

穷举法很容易想到,只要让3个整数挨个穷举就可以了。
虽然还可以在循环范围上进行优化,不过那在接下来的改进面前算不了什么。
但是因为数据范围的问题,会超时TLE,不得不让我们动起了歪脑筋(可能在大佬中就是正常思路)。
为了在文中方便讨论,代码中的i文中变成100i

改进1

因为题目的数据十分友善,可以利用一下。
数学点的描述: 50a+20b+10c=100i(a,b,c,iN) 50 a + 20 b + 10 c = 100 i ( a , b , c , i ∈ N )
看c好欺负: c=10i5a2bN c = 10 i − 5 a − 2 b

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值