hdu1521 指数型母函数 求解多重集排列数

  题意是给你n个物品, 每个物品有ai个, 从中选取m个物品的排列数是多少??这个问题可以使用指数型母函数来解决。。代码如下:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
int f[15];
void initf()
{
    f[0] = 1;
    for(int i=1; i<=11; i++) f[i] = i*f[i-1];
}
int n, m;   //n个物品选出m件
int a[20];  //每件物品的数量
double c1[20], c2[20];

int main()
{
    initf();
    while(cin>>n>>m)
    {
        for(int i=1; i<=n; i++) cin>>a[i];
        memset(c2, 0, sizeof(c2));
        memset(c1, 0, sizeof(c1));
        for(int i=0; i<=a[1]; i++) c1[i]=1.0/f[i];
        for(int i=2; i<=n; i++)
        {
            for(int j=0; j<=10; j++)
                for(int k=0; k<=a[i]; k++) if(j+k<=10)
                        c2[j+k] += c1[j]/f[k];
            for(int j=0; j<=10; j++) c1[j]=c2[j], c2[j]=0;
        }
        //cout<<(int)c1[m]*f[m]<<endl;
        printf("%.0f\n", c1[m]*(double)f[m]);
    }
    return 0;
}

 

posted @ 2016-02-25 16:27  xing-xing  阅读(260)  评论(0编辑  收藏  举报