蓝桥杯:2017年第八届蓝桥杯省赛B组第八题—PREV-36包子凑数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/belous_zxy/article/details/84328924


所有包子数的公因数不为1,就会出现有无限多个凑不出来的数。

公因数为1则计算出10000以内有几个凑不出来的。

猜测下最大可能出现的数,可用的包子数越少(最少2);包子数越大(99、100),99x+100y得到一个数,那么为了能达到每隔1个数都能凑出,势必要用到100-99=1。

少用一个100,换用99可以让当前凑出的数-1。

很神奇,那么从一个100开始,99

两个100,198

三个297。。。

什么时候凑出来xxx01呢,当然是9901。

据此推测可能的最大数是9802,最后一个凑不出来的就是9801。

推理完毕!


#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#define DPMAX 9802
int gcd(int m,int n)
{
	return m%n?gcd(n,m%n):n;
}
int main(int argc,char **argv)
{
	int cnt,sp[105]={0},isp;
	scanf("%d",&cnt);
	bool dp[DPMAX]={false};
	for(int i=0;i<cnt;i++)
		scanf("%d",&sp[i]);
	isp=sp[0];
	for(int i=1;i<cnt;i++)
		isp=gcd(isp,sp[i]);
	if(isp==1)
	{
		dp[0]=true;
		for(int i=0;i<cnt;i++)
			for(int j=0;j+sp[i]<DPMAX;j++)
				if(dp[j])
					dp[j+sp[i]]=true;
		int ans=0;
		for(int i=0;i<DPMAX;i++)
			if(dp[i]==false)
				ans++;
		printf("%d\n",ans);
	}
	else
		printf("INF\n");
	return EXIT_SUCCESS;
} 


事实证明,我的推测是完全正确的,哈哈哈。

END

猜你喜欢

转载自blog.csdn.net/belous_zxy/article/details/84328924
今日推荐