#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;
}
hdu 1085
最新推荐文章于 2020-07-26 13:40:04 发布