HDOJ-1521排列组合(指数型母函数)

来源:互联网 发布:单词默写软件 编辑:程序博客网 时间:2024/05/01 07:52

以前曾经写过普通的母函数,但是指数型母函数还没有写过。就在这里整理一下吧。

指数型母函数主要处理排列方案问题。

比如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;}


0 0
原创粉丝点击