hdu 1085

来源:互联网 发布:linux dhcp分配主机名 编辑:程序博客网 时间:2024/06/07 06:19
#include <iostream>using namespace std;int main(int argc, char *argv[]){    int num[3];    int cent[3]={1,2,5};          //次数增长步长     while(scanf("%d %d %d",&num[0],&num[1],&num[2]) != EOF)    {        if(num[0]==0&&num[1]==0&&num[2]==0)            break;        int i,j,k;        int c[8001],tempC[8001];     //因为三种硬币最多1000枚,1*1000+2*1000+5*1000=8000,那么多项式乘积的最高次数为8000                                      //c保存累计相乘各项的系数,tempC保存c和当前项相乘的系数                                            //c[i] 表示次数为i的那一项的系数                                               int max=num[0]+2*num[1]+5*num[2];   //求出该组输入条件下的最高次数                  for(i=0;i<=8001;i++)            {            c[i]=0;            tempC[i]=0;         }                        //母函数为(1+x+x^2+...x^num[0])(1+x^2+x^4+....x^2*num[1])(1+x^5+x^10+...+x^5*num[2])         for(i=0;i<=cent[0]*num[0];i+=cent[0])   //第一个多项式的系数初始化         {            c[i]=1;        }                for(i=1;i<3;i++)    //i表示总共有多少个多项式         {            for(j=0;j<=max;j++)    //累计相乘的x^j的系数             {                for(k=0;k+j<=max && k<=cent[i]*num[i];k+=cent[i])   //当前项x^k的系数                 {                    tempC[k+j]+=c[j];   //x^j * x^k=x^(j+k)                }            }                        for(j=0;j<=max;j++)    //将临时数组清零             {                c[j]=tempC[j];                tempC[j]=0;            }        }                for(i=0;i<=max;i++)        {            if(c[i]==0)                break;        }        printf("%d\n",i);    }    return 0;}

0 0