HDU1521 排列组合【指数型母函数】

来源:互联网 发布:p2p网络借贷 论文 编辑:程序博客网 时间:2024/04/29 19:17

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1521


题目大意:

有n种物品,并且知道每种物品的数量。要求从中选出m件物品的排列数。例如

有两种物品A,B,并且数量都是1,从中选2件物品,则排列有"AB","BA"两种。


思路:

典型的指数型母函数。指数型母函数的一般问题为:n个元素组成的多重集,其

中a1重复了n1次,a2重复了n2次,…,ak重复了nk次。若n = n1 + n2 + … +

nk,从n个元素中取r个排列,求不同的排列数。



AC代码:

#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>using namespace std;double f[] = {1,1,2,6,24,120,720,5040,40320,362880,3628800};double num[11],c1[11],c2[11];int main(){    int N,M;    while(cin >> N >> M)    {        memset(c1,0,sizeof(c1));        memset(c2,0,sizeof(c2));        for(int i = 0; i < N; ++i)            cin >> num[i];        for(int i = 0; i <= num[0]; ++i)            c1[i] = 1.0/f[i];        for(int i = 1; i < N; ++i)        {            for(int j = 0; j <= M; ++j)                for(int k = 0; k <= num[i] && (k+j)<=M; ++k)                    c2[k+j] += (c1[j]/f[k]);            for(int j = 0; j <= M; ++j)            {                c1[j] = c2[j];                c2[j] = 0;            }        }        double s = 1.0*c1[M]*f[M];        printf("%.0lf\n",s);    }    return 0;}


0 0