原题链接:1034. 钞票兑换
时间限制: 1000 ms 空间限制: 262144 KB 具体限制
题目描述
将任意给定的整百元钞票,兑换成10元、20元、50元小钞票形式。输出兑换方案总数。
输入
输入需要兑换的钞票总数n。
输出
输出方案总数。
样例输入
100
样例输出
10
数据范围限制
100<=n<=1000000
提示
方案序号10元张数20元张数50元张数100220503121424053116430750186209810101000
题记:
这道题用暴力枚举法会超时,所以要想办法优化一下。
方法一(好理解):先算出最多可以换成多少个50元,(用fifty_max表示),然后算出在换成不同张数50元的情况下,最多可以换多少个20元(twenty_max),每种情况下方案数(count)就是twenty_max+1。把所有方案数加起来即为结果。
你如果不知道方案数怎么来的,为什么是twenty_max+1,可以这样想:twenty_max是兑换成1、2、3……、twenty_max张20元的情况,1是兑换成0张20元,即都换成10元的情况。
方法二(最简洁):找到数学规律,说不清为什么(以后我找到合适的语言解释了再补充吧)……但是这么做是对的!这种方法看看就行了,想不到就算了……具体看代码吧。
两种方法C++程序如下:
(方法一)
#include<iostream>
using namespace std;
int main(void){
int n, fifty_max, twenty_max, count=0;
cin >> n;
fifty_max = n/50;
for(int i=0; i<=fifty_max; i++){
twenty_max = (n-50*i)/20;
count += twenty_max + 1;
}
cout << count;
return 0;
}
(方法二)
#include<iostream>
using namespace std;
int main(void){
int n, m, count=0;
cin >> n;
m = n/100;
count = 5*m*m + 4*m + 1;
cout << count;
return 0;
}