普通型母函数主要是求组合的方案数,而指数型母函数则是求多重排列数。
例如:设有8个元素,a1重复3次,a2重复2次,a3重复3次。从中取出r个集合,求其组合数。
推荐:http://www.wutianqi.com/?p=2644
对于代码的推荐:http://blog.csdn.net/a342374071/article/details/6537960
以hdu 1521为例:
有n种物品,并且知道每种物品的数量。要求从中选出m件物品的排列数。例如有两种物品A,B,并且数量都是1,从中选2件物品,则排列有"AB","BA"两种。
每组输入数据有两行,第一行是二个数n,m(1<=m,n<=10),表示物品数,第二行有n个数,分别表示这n件物品的数量。
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> #include<vector> #include<set> #include<map> #include<queue> #include<math.h> using namespace std; #define maxn 111 //这里别忘了0的阶乘也是1! int factor[11]={1,1,2,6,24,120,720,5040,40320,326880,3268800}; int num[12]; double c1[maxn],c2[maxn]; int main(){ int n,m; while(~scanf("%d%d",&n,&m)){ memset(c1,0,sizeof(c1)); memset(c2,0,sizeof(c2)); for(int i=1;i<=n;i++) scanf("%d",&num[i]); for(int i=0;i<=num[1];i++){ //首先算出第一个括号中各项的系数 c1[i]=1.0/factor[i]; } for(int i=2;i<=n;i++){ for(int j=0;j<=m;j++){ //因为最多只选m个,所以循环到m就好!!! for(int k=0;k<=num[i]&&k<=m;k++){ //k<=m! c2[j+k]+=c1[j]/factor[k]; //j+k代表的也是指数,c1[j]还要再除以k的阶乘,根据那个式子来! } } for(int j=0;j<=m;j++){ c1[j]=c2[j]; c2[j]=0; } } printf("%.0lf\n",c1[m]*1.0*factor[m]); //最后输出小心精度问题 } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/acmer_hades/article/details/47379915