第八届蓝桥杯个人赛省赛(软件类)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行每行包含一个整数Ai。(1

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

例如,
输入:
2  
4  
5   

程序应该输出:
6  

再例如,
输入:
2  
4  
6    

程序应该输出:
INF

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

资源约定:
峰值内存消耗(含虚拟机) CPU消耗  

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

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

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

 

二【解题思路】

     我们看完题目之后知道,几个数字的组合是否能得到其它的数字,如果凑不出啦,那么就记录次数(可以有无穷次数)。那么我们会想到这样的多项式的形式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的变量统计总数就是凑不出来的数量。

 

三【解题步骤】

 

四【总结】

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

文章知识点与官方知识档案匹配,可进一步学习相关知识算法技能树首页概览34684 人正在系统学习中

来源:threecat.up

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年3月7日
下一篇 2020年3月7日

相关推荐