这里就是母函数的应用:
(1+x+...+x^num1)(1+x^2+...+x^2num2)(1+x^5+,,,+x^5num3),展开,系数不为0的数都是可以由硬币组合出来的。
代码里面的主要要注意的问题就是初始化问题,因为在母函数里面会需要后面的一大串的数字进行组合而得来的,就是上式子展开
然后要注意数字后面的0的问题,还有首个数字的第一个式子的初始化为1
代码就是、
#include<stdio.h> #include<string.h> const int maxn=1000*(1+2+5)+20; int s1[maxn],s2[maxn]; int main() { int n,m,p; while(scanf("%d%d%d",&n,&m,&p)&&n+m+p>0) { for(int i=0;i<=n;i++){ s1[i]=1; s2[i]=0; } for(int j=0;j<=n;j++) for(int k=0;k<=2*m;k+=2) s2[j+k]+=s1[j]; for(int i=0;i<=n;i++){ s1[i]=s2[2]; s2[i]=0; } for(int j=0;j<=n+2*m;j++) for(int k=0;k<=5*p;k+=5) s2[j+k]+=s1[j]; int tag=1; for(int i=0;;i++) if(s2[i]==0){ printf("%d\n",i); tag=0; break; } if(tag) printf("%d\n",n+m*2+p*5+1); } return 0; }