找零钱 (剪枝,提高效率)

Description

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

Input

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

Output

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

 

 

代码一:

#include<stdio.h>
int main()
{
	int a,b,c,d,e;
	int n,count;
	while(scanf("%d",&n)!=EOF)
		{
		count=0;
		for(a=0;a<=5;a++)
			for(b=0;b<=10;b++)
				for(c=0;c<=25;c++)
					for(d=0;d<=50;d++)
						for(e=0;e<=250;e++)
						{
						if (a*50+b*25+c*10+d*5+e==n&&a+b+c+d+e<=100) count++;
						}
		printf("%d/n",count);		
		}
	return 0;
}
代码二 :最里面的一层循环, 省略掉。写成e=n-a*50-b*25-c*10-d*5;
同时每层循环的 ,终止点  加 一层 剪枝:
判断 e是否 大于0
代码:
#include<stdio.h>
int main()
{
	int a,b,c,d,e;
	int n,count;
	while(scanf("%d",&n)!=EOF)
		{
		count=0;
		for(a=0;a<=5;a++)
			for(b=0;b<=(n-a*50)/25;b++)
				for(c=0;c<=(n-a*50-b*25)/10;c++)
					for(d=0;d<=(n-a*50-b*25-c*10)/5;d++)
					{
						e=n-a*50-b*25-c*10-d*5;
						//if (e>=0&&a+b+c+d+e<=100) printf("%d %d %d %d %d/n",a,b,c,d,e);
						if (e>=0&&a+b+c+d+e<=100) count++;
					}
		printf("%d/n",count);		
		}
	return 0;
}
代码三:
打表法:
代码:
#include<stdio.h>
int s[250];
int main()
{
	int a,b,c,d,e,f,g,sum;
	for(a=0;a<=2;a++)
		for(b=0;b<=5;b++)
			for(c=0;c<=12;c++)
				for(d=0;d<=25;d++)
					for(e=0;e<=50;e++)
						for(f=0;f<=120;f++)
							for(g=0;g<=250;g++)
								{
								sum=a*100+b*50+c*20+d*10+e*5+f*2+g;
								if (sum>250||a+b+c+d+e+f+g>100) break;
								s[sum]++;
								}
	int n;
	while(scanf("%d",&n)!=EOF&&n!=0)
		{
		printf("%d/n",s[n]);
		}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值