/******************************** 题目大意:不可以用num1个1,num2个2,num3个5组合得到的最小数; 题目解析:求(1+x+.....+x^num1)(1+x^2+....+x^(2*num2))(1+x^5+....X^(5*num3)) 的系数为零的指数;若系数都不为零,则最小数为sum+1; 错误分析:1.不能确定j的循环次数; 2.没有把M数值开到最大,导致ACCESS_VIOLATION (由于指针、数组下标越界造成的) **************************************/ #include<stdio.h> #include<iostream> #include<algorithm> #define M 10000 using namespace std; int a1[M],a2[M] ,eum[3]={1,2,5}; int main() { int i,j,k,num1,num2,num3,s,c; while(scanf("%d %d %d",&num1,&num2,&num3),num1||num2||num3) { s=num1+num2*2+num3*5; for(i=0;i<=num1;i++)//先为(1+x+.....+x^num1)的系数赋值 { a1[i]=1; a2[i]=0; } c=num1; for(i=2;i<=3;++i)//控制前i-1个表达式与第i个表达式的乘积,总共有3的表达式 { for(j=0;j<=c;++j)//控制表达i的项数; for(k=0;k+j<=s;k+=eum[i-1])//指数k最大不能超过1,2,5组合总数 { a2[j+k]+=a1[j]; } for(j=0;j<=s;++j) { a1[j]=a2[j]; a2[j]=0; } c=num1+2*num2;//j的大小不能大于1,2的组合总数 } for(i=0;i<=s;i++) { if(a1[i]==0) { printf("%d\n",i); break; } } if(i==s+1)printf("%d\n",i); } return 0; }