统计硬币
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3844 Accepted Submission(s): 2693
Problem Description
假设一堆由1分、2分、5分组成的n个硬币总面值为m分,求一共有多少种可能的组合方式(某种面值的硬币可以数量可以为0)。
Input
输入数据第一行有一个正整数T,表示有T组测试数据;
接下来的T行,每行有两个数n,m,n和m的含义同上。
接下来的T行,每行有两个数n,m,n和m的含义同上。
Output
对于每组测试数据,请输出可能的组合方式数;
每组输出占一行。
每组输出占一行。
Sample Input
2 3 5 4 8
Sample Output
1 2/*题解:(母函数) 刚开始用一位数组做的 ,发现可以求出来由1分、2分、5分组成的总面值为m分的硬币组成方式,但是n没什么用了。 然后开始用二维数组,第一位存组成方式,第二位存n枚硬币的情况。注:此题可以直接枚举,形如 百钱白鸡 */#include<cstdio> #include<cstring> int c1[1010][1010],c2[1010][1010]; int main() { int T,i,j,k,h,n,m; scanf("%d",&T); while(T--) { scanf("%d %d",&n,&m); memset(c1,0,sizeof(c1)); memset(c2,0,sizeof(c2)); for(i=0; i<=n; i++) c1[i][i]=1; for(i=2; i<=5; i+=3) { for(j=0; j<=m; j++) { for(k=0; k*i+j<=m&&k<=n; k++) //计算钱数 { for(h=0; h+k<=n; h++) //计算个数 c2[k*i+j][h+k]+=c1[j][h]; } } for(j=0; j<=m; j++) for(h=0; h<=n; h++) { c1[j][h]=c2[j][h]; c2[j][h]=0; } } printf("%d\n",c1[m][n]); } return 0; }