http://acm.hdu.edu.cn/showproblem.php?pid=1085
这题是母函数的运用,解题关键在于硬币的数量即不是1,也不是无限,所以要一种面值,一种面值的往上叠加
#include<stdio.h> int c1[10001],c2[10001]; int main() { int max,num1,num2,num5,i,j,k; while(scanf("%d%d%d",&num1,&num2,&num5),num1||num2||num5) { max=num1*1+num2*2+num5*5; for(i=0;i<=max;i++) c1[i]=c2[i]=0; for(i=0;i<=num1;i++) c1[i]=1; //这里是所有1能组成的 for(i=0;i<=num1;i++) for(j=0;j<=num2*2;j+=2) c2[i+j]+=c1[i];//这里是在1组完了的基础上在加上硬币值为2的方案数 for(i=0;i<=num1+num2*2;i++) { c1[i]=c2[i]; c2[i]=0; } for(i=0;i<=num1+num2*2;i++) for(j=0;j<=num5*5;j+=5) c2[i+j]+=c1[i]; for(i=0;i<=num1+num2*2+num5*5;i++) { c1[i]=c2[i]; c2[i]=0; }//同上,这里是处理面值5的情况,本题注意范围的变化,其实就是一种一种的往上加而已 for(i=0;i<=max;i++) if(!c1[i]) { printf("%d ",i); break; } if(i>max) printf("%d ",i); } return 0; }