找零钱问题(暴力枚举+剪枝)

本文解析了一道经典的找零钱算法题,通过暴力枚举加剪枝的方法,在限定条件下计算出不同面值组合的数量。文章提供了一份详细的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

找零钱

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

我们知道人民币有1、2、5、10、20、50、100这几种面值。
现在给你n(1≤n≤250)元,让你计算换成用上面这些面额表示且总数不超过100张,共有几种。
比如4元,能用4张1元、2张1元和1张2元、2张2元,三种表示方法。

输入

输入有多组,每组一行,为一个整合n。  输入以0结束。

输出

输出该面额有几种表示方法。

示例输入

1
4
0

示例输出

1
3
 
废话不多说了。。直接枚举肯定超时。。
 
#include <iostream>  //找零钱 暴力枚举+剪枝
using namespace std;
#include <cstdio>
int main()
{
 int a,b,c,d,e,f,n;
 while(cin>>n)
 {
	 int count=0;
   if(n==0)
   break;
   for(a=0;a<=n/100;a++) //从100元到1元往下枚举
   {
	   for(b=0;b<=n/50;b++)
	   {
		   if(n-(a*100+b*50)<0) break;  //如果此时100元和50元的面值已经大于所给值,再往下枚举没意义,下面类同
		   for(c=0;c<=n/20;c++)
		   {
			   if(n-(a*100+b*50+c*20)<0) break;
              for(d=0;d<=n/10;d++)
			  {
				  if(n-(a*100+b*50+c*20+d*10)<0) break;
				  for(e=0;e<=n/5;e++)
				  {
					  if(n-(a*100+b*50+c*20+d*10+e*5)<0) break;
					  for(f=0;f<=n/2;f++)
					  {
						  if(n-(a*100+b*50+c*20+d*10+e*5+f*2)<0) break;
					      int g=n-(a*100+b*50+c*20+d*10+e*5+f*2);
							  if(n==a*100+b*50+c*20+d*10+e*5+f*2+g&&a+b+c+d+e+f+g<=100)
								  count++;
					  }
				  }
			  }
		   }
	   }
   }
							  cout<<count<<endl;
 }
 return 0;
} 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值