码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-08-17 19:33:14      阅读:104      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:

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


版权声明:本文为博主原创文章,未经博主允许不得转载。

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

标签:

原文地址:http://blog.csdn.net/lianai911/article/details/47729559

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!