第八届蓝桥杯个人赛省赛(软件类)C++B组试题第八题

一【题目描述】


标题:包子凑数

小明几乎每天早晨都会在一家包子铺吃早餐。他发现这家包子铺有N种蒸笼,其中第i种蒸笼恰好能放Ai个包子。每种蒸笼都有非常多笼,可以认为是无限笼。

每当有顾客想买X个包子,卖包子的大叔就会迅速选出若干笼包子来,使得这若干笼中恰好一共有X个包子。比如一共有3种蒸笼,分别能放3、4和5个包子。当顾客想买11个包子时,大叔就会选2笼3个的再加1笼5个的(也可能选出1笼3个的再加2笼4个的)。

当然有时包子大叔无论如何也凑不出顾客想买的数量。比如一共有3种蒸笼,分别能放4、5和6个包子。而顾客想买7个包子时,大叔就凑不出来了。

小明想知道一共有多少种数目是包子大叔凑不出来的。

输入
----
第一行包含一个整数N。(1 <= N <= 100)
以下N行每行包含一个整数Ai。(1 <= Ai <= 100)  

输出
----
一个整数代表答案。如果凑不出的数目有无限多个,输出INF。

例如,
输入:
2  
4  
5   

程序应该输出:
6  

再例如,
输入:
2  
4  
6    

程序应该输出:
INF

样例解释:
对于样例1,凑不出的数目包括:1, 2, 3, 6, 7, 11。  
对于样例2,所有奇数都凑不出来,所以有无限多个。  

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗  < 1000ms


请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

注意:
main函数需要返回0;
只使用ANSI C/ANSI C++ 标准;
不要调用依赖于编译环境或操作系统的特殊函数。
所有依赖的函数必须明确地在源文件中 #include <xxx>
不能通过工程设置而省略常用头文件。

提交程序时,注意选择所期望的语言类型和编译器类型。


 

二【解题思路】

     我们看完题目之后知道,几个数字的组合是否能得到其它的数字,如果凑不出啦,那么就记录次数(可以有无穷次数)。那么我们会想到这样的多项式的形式a0X+a1Y+a2K+...=C,这里面a0,a1,a2可以看做蒸笼容量,然后我们找数字来填空,让C有解。题目需要我们做的是求出无解的个数,首先什么时候有解呢?当a0,a1,a2互质的时候是有无数个解的,那么它们不互质的时候就有无穷多个无解的情况(这里用简单的数学知识可以知道,或者记住结论,因为你想,C%num取余是他们的倍数,当他们互质的情况下,我们可以找到无数多个数字让C有解)。那么这里我们就考虑清楚了输出INF的情况。再仔细思考一下,这个像不像一个完全背包为题,我们找到物品,尽量的装,只是这里是让物品到达某一个数字。这里我们定义一个dp表,判断是否有解,f[10000]是bool类型的变量,将f[0]为true,0的情况当然可以凑出来,当我们添加第一个蒸笼a[i],那么f(0+a[i])也是一定可以凑出来的,比如我们加入2,那么2一定可以凑出来,之后如果f(j)可以凑出来,那么f(j+a[i])也一定可以凑出来。最后的结果我们将凑不出来的f=false的变量统计总数就是凑不出来的数量。

三【解题步骤】

#include<iostream>
using namespace std;
int a[101];//定义蒸笼容器数组
bool f[10000];//定义bool型变量来判断添加蒸笼时哪些可以凑出来
int gcd(int a,int b)//求最大公约数
{
	if(b==0) return a;//利用辗转相除法,大家都很熟悉这个
	gcd(b,a%b);
}
int main()
{
	int n,g;
	cin>>n;//处理输入
	f[0]=true;//0肯定是可以凑出来的,所以f[0]==true
	for(int i=1;i<=n;i++)//输入蒸笼容器
	{
		cin>>a[i];
		if(i==1) g = a[i];//将g赋值为第一个数组
		else g= gcd(a[i],g);//两两求最大公约数
		for(int j=0;j<10000;j++)//这里利用dp表求出可以凑出来的个数,用bool表示
		{
			if(f[j]) f[j+a[i]]=true;//如果f[j]可以凑出来,那么f[j+a[i]]也一定可以凑出来
		}
	}
	if(g!=1) //如果这些蒸笼容器数不互质,有无穷多个无解的情况
	{
		cout<<"INF"<<endl;
		return 0;
	}
	int ans = 0;
	for(int i=0;i<10000;++i)//统计有多少个无解的情况
	{
		if(!f[i]) ans++;
	}
	cout<<ans<<endl;
	return 0; 	 
}

 

四【总结】

     这里无穷多个的情况大家都很容易知道互质这一点,但是这里可以和完全背包联系到一起,用dp表判断是有有解,最后得到统计的个数。如有更好的解法,欢迎交流,谢谢。

发布了123 篇原创文章 · 获赞 234 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_43919400/article/details/105313347