题目描述
将任意给定的整百元钞票,兑换成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,i∈N) 50 a + 20 b + 10 c = 100 i ( a , b , c , i ∈ N )
看c好欺负: c=10i−5a−2b∈N c = 10 i − 5 a − 2 b