hdu 2566 统计硬币 母函数 硬币总个数一定 且正好用完组成m的方案数
2013-06-10 15:36
375 查看
统计硬币
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2970 Accepted Submission(s): 2063
[align=left]Problem Description[/align]
假设一堆由1分、2分、5分组成的n个硬币总面值为m分,求一共有多少种可能的组合方式(某种面值的硬币可以数量可以为0)。
[align=left]Input[/align]
输入数据第一行有一个正整数T,表示有T组测试数据;
接下来的T行,每行有两个数n,m,n和m的含义同上。
[align=left]Output[/align]
对于每组测试数据,请输出可能的组合方式数;
每组输出占一行。
[align=left]Sample Input[/align]
2
3 5
4 8
[align=left]Sample Output[/align]
1
2
[align=left]Author[/align]
lemon
[align=left]Source[/align]
绍兴托普信息技术职业技术学院——第二届电脑文化节程序设计竞赛
[align=left]Recommend[/align]
yifenfei
思路:
母函数 一开始以为不一定必须用完 wa了一次
如果不懂母函数可以看我的母函数专题里面的讲解
http://blog.csdn.net/hnust_xiehonghao/article/details/7857874
并且结合这个题应该可以搞定
http://blog.csdn.net/hnust_xiehonghao/article/details/7857898
http://blog.csdn.net/hnust_xiehonghao/article/details/8871224
#include<stdio.h> #include<string.h> #define mx 1000 int c1[mx][100],c2[mx][100]; int a[5]={0,1,2,5}; int main() { int cas,n,m,i,j,k,l; scanf("%d",&cas); while(cas--) { scanf("%d %d",&n,&m);//n个硬币 memset(c1,0,sizeof(c1)); memset(c2,0,sizeof(c2)); for(i=0;i<=n;i++) { c1[i][i]=1; } for(i=2;i<=3;i++) { for(j=0;j<=m;j++) { for(k=0;k+j<=m;k+=a[i]) for(l=0;l+k/a[i]<=n;l++) c2[j+k][l+k/a[i]]+=c1[j][l]; } for(k=0;k<=m;k++) for(l=0;l<=n;l++) { c1[k][l]=c2[k][l]; c2[k][l]=0; } } int ans=0; printf("%d\n",c1[m] ); } return 0; }
相关文章推荐
- hdu 2566 统计硬币(母函数)
- hdu 2566 统计硬币
- HDU - 2566 统计硬币(常数时间解法)
- hdu 2566 统计硬币
- HDU--2566统计硬币【水题】
- HDU 1398 n由i^2(i=1,2,3..17)组成的方案数(母函数 || 完全背包)
- hdu 2566 统计硬币
- hdu 2566 统计硬币 dfs 不能排除组合重复的情况 代码不完整
- hdu 2566统计硬币
- 统计硬币(HDU 2566)
- hdu 2566统计硬币(枚举)
- hdu 2566 统计硬币
- hdu 2566 统计硬币
- HDU 2566 统计硬币。
- hdu 2566 统计硬币
- HDU 2566 统计硬币
- hdu 2566 统计硬币 数学解法
- HDU-2566-统计硬币
- HDU 2566 统计硬币
- hdu 2566统计硬币