我们知道人民币有1、2、5、10、20、50、100这几种面值。现在给你n(1≤n≤250)元,让你计算换成用上面这些面额表示且总数不超过100张,共有几种。比如4元,能用4张1元、2张1元和1张2元、2张2元,三种表示方法。
输入: | 输入有多组,每组一行,为一个整合n。输入以0结束。 |
输出: | 输出该面额有几种表示方法。 |
最笨的方法就是穷举法,不过很容易易超时不大可取,对于n 元人民币 100元最多 n/100 张,50元最多n/50, 20元最多n/20张,5元最多n/5 2元最多100张,1 元最多100张
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<fstream>
using namespace std;
//穷举法
int fun(int n)
{
if(n<1||n>250)
{
cerr<<"Invalid Input"<<endl;
return -1;
}
int x1=100,x2=100,x5=50,x10=25,x20=12,x50=5,x100=2;
int count=0;
for(int i100=0;i100<=n/100;i100++)//一百元
{
for(int i50=0;i50<=n/50;i50++)//50元
{
for(int i20=0;i20<=n/20;i20++)//20元
{
for(int i10=0;i10<=n/10;i10++)//10元
{
for(int i5=0;i5<=n/5;i5++)//5元
{
for(int i2=0;i2<=x2;i2++)
{
for(int i1=0;i1<=x1;i1++)
{
if(i1+i2*2+i5*5+i10*10+i20*20+i50*50+i100*100==n&&(i1+i2+i5+i10+i20+i50+i100<=100))
{
count++;
}
}
}
}
}
}
}
}
return count;
}
int main()
{
/*fstream fout("D:\\wtmtest.txt",ios::out);//打表法 没办法的办法可以考虑用笨方法将1到250 的结果都先写到文件中 然后将结果考到数组中
fout<<'{';
for(int i=1;i<=100;i++ )
{
fout<<fun(i)<<',';
}
cout<<"done"<<endl;
fout<<'}';
fout.close();*/
// int result[250] ={1,2,2,3,4,5,6,7,8,11,12,15,16,19,22,25,28,31,34,41,44,51,54,61,68,75,82,89,96,109,116,129,136,149,162,175,188,201,214,236,249,271,284,306,328,350,372,394,416,451,473,508,530,565,600,635,670,705,740,793,828,881,916,969,1022,1075,1128,1181,1234,1311,1364,1441,1494,1571,1648,1725,1802,1879,1956,2064,2141,2249,2326,2434,2542,2650,2758,2866,2974,3121,3229,3376,3484,3631,3778,3925,4072,4219,4366,4563};
int n;
while(1)
{
cin>>n;
if(n==0)
{
break;
}
cout<<fun(n)<<endl;
}
return 0;
}
其他方法: