以前曾经写过普通的母函数,但是指数型母函数还没有写过。就在这里整理一下吧。
指数型母函数主要处理排列方案问题。
比如hdoj1521这道题就是典型的指数型母函数问题:
有n种物品,并且知道每种物品的数量。要求从中选出m件物品的排列数。例如有两种物品A,B,并且数量都是1,从中选2件物品,则排列有"AB","BA"两种。
下面是从百度文库里找的一篇ppt(如有侵权请告知)
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
const int N=15;
int num[N];
double fac[N],c[2][N];
void init()
{
int i;
memset(fac,0,sizeof(fac));
fac[0]=1;
for(i=1;i<=11;i++)
fac[i]=i*(int)(fac[i-1]+0.1);
}
void work(int n,int m)
{
int i,j,k;
memset(c,0,sizeof(c));
for(i=0;i<n;i++) scanf("%d",&num[i]);
//只有一种物品是无论怎么排列只有一种方案
for(i=0;i<=num[0];i++)
c[1][i]=1.0/fac[i];
for(i=2;i<=n;i++)
{
for(j=0;j<=m;j++)
for(k=0;(k<=num[i-1])&&(k+j<=m);k++)
c[i&1][j+k]+=c[(i-1)&1][j]/fac[k];
//滚动数组,注意用后清零
for(j=0;j<=m;j++) c[(i-1)&1][j]=0;
}
printf("%.0lf\n",c[n&1][m]*fac[m]);
}
int main()
{
int n,m;
init();
while(scanf("%d%d",&n,&m)==2)
work(n,m);
return 0;
}