找零钱

我们知道人民币有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;
}


其他方法:










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值