杭电acm1085.Holding Bin-Laden Captive!(母函数)

/********************************
题目大意:不可以用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;
}


你可能感兴趣的:(ACM,杭电)