题意:给n1个1,n2个2,n3个5,问它们不能组成的最小正整数是谁。
母函数:http://www.cnblogs.com/FCWORLD/archive/2010/10/10/1847218.html
#include<stdio.h>
#include<string.h>
int main()
{
int i,j,k,a,b,c,d[10001];
while(scanf("%d %d %d",&a,&b,&c)!=EOF)
{
if(0==a&&0==b&&0==c)
break;
memset(d,0,sizeof(d));
for(j=0;j<=a;j++)
for(k=0;k+j<=a+2*b;k=k+2)
d[k+j]++;
for(j=0;j<=a+2*b&&d[j];j++)//&&a[j]是排除从0到a+2b之内不存在的项
for(k=0;k+j<=a+2*b+5*c;k=k+5)
d[k+j]++;
for(i=0;i<=a+2*b+5*c+1;i++)//+1是因为如果情况中的全满足 那么大于范围的第一个就是所求
{
if(d[i]==0)
{
printf("%d\n",i);
break;
}
}
}
return 0;
}
规律:
若没有1,则输出1;
若有1,则从1到n1+2*n2的数肯定都能拼成,
最后,只需考虑5的个数,若n1+2*n2能达到4以上,则在所有的5组合的过成中,中间的4个间隔可以由n1+2*n2
#include<stdio.h>
int main(){
int a,b,c;
while(scanf("%d%d%d",&a,&b,&c)&&(a||b||c)){
if(a==0) printf("1\n");
else if(a+2*b<4) printf("%d\n",a+2*b+1);
else printf("%d\n",a+2*b+c*5+1);
}
return 0;
}