排列组合 HDU - 1521 -指数型母函数

  • 排列组合

  • HDU - 1521
  • 一句话区分指数型母函数和母函数就是 母函数是组合数,指数型母函数是排列数
  • #include<bits/stdc++.h>
    using namespace std;
    #define maxn 12
    double ans[maxn],tp[maxn],inv[maxn];
    int n,m,a[maxn];
    void init()
    {
        inv[0]=1;
        for(int i=1; i<=11; i++)
            inv[i]=inv[i-1]*i;
    }
    int main()
    {
        init();
        while(~scanf("%d%d",&n,&m))
        {
            for(int i=1; i<=n; i++)
                scanf("%d",&a[i]);
            memset(ans,0,sizeof(ans));
            memset(tp,0,sizeof(tp));
            for(int i=0; i<=a[1]; i++)
                ans[i]=1/inv[i];
            for(int i=2; i<=n; i++)
            {
                for(int j=0; j<=m; j++)
                    for(int k=0; k<=a[i]&&j+k<=m; k++)
                        tp[j+k]+=ans[j]/inv[k];
                for(int j=0; j<=m; j++)
                    ans[j]=tp[j],tp[j]=0;
            }
            printf("%.0lf\n",ans[m]*inv[m]);
        }
        return 0;
    }
    

      

原文地址:https://www.cnblogs.com/SDUTNING/p/10261591.html

时间: 2024-10-01 04:10:59

排列组合 HDU - 1521 -指数型母函数的相关文章

HDU 1521 指数型母函数

方法一: DFS 方法二:生成函数 每个数可以重复一定次数,求排列组合数,这是裸的指数型生成函数: 1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 double c1[15],c2[15]; 6 int a[15]; 7 int num[15]; 8 9 10 int main() { 11 12 a[0] = 1; 13 for(int i=1; i<13; i++) 14 a[i] = a[i-1]*i; 15 16 i

ACM~排列组合&amp;&amp;hdu样例

排列组合是数学中的一个分支,在计算机编程方面也有很多的应用,主要有排列公式和组合公式,错排公式.母函数.Catalan Number(卡特兰数)等. 一.有关组合数学的公式 1.排列公式   P(n,r)=n!/r! 2.组合公式   C(n,r)=n!/(r!*(n-r)!)  C(n,r)=C(n-1,r)+C(n-1,r-1) 3.错排公式   d[1]=0;   d[2]=1; d[n]=(n-1)*(d[n-1]+d[n-2]) 4.卡特兰数 前几项:1, 2, 5, 14, 42,

指数型母函数

指数型母函数主要是关于排列组合方面的问题. 分别看两个比较典型的问题对比: 普通母函数问题: 有红球两个,白球.黄球各一个,试求有多少种不同的组合方案. 指数型母函数问题:假设有8个元素,其中a1重复3次,a2重复2次,a3重复3次.从中取r个组合,求其组合数. 对于上面的问题"假设有8个元素,其中a1重复3次,a2重复2次,a3重复3次.从中取r个组合,求其组合数.":

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

题目链接: 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个元素中

hdu1521 排列组合(指数型母函数)

题意: 有n种物品,并且知道每种物品的数量ki.要求从中选出m件物品的排数.         (全题文末) 知识点: 普通母函数 指数型母函数:(用来求解多重集的排列问题) n个元素,其中a1,a2,····,an互不相同,进行全排列,可得n!个不同的排列. 若其中某一元素ai重复了ni次,全排列出来必有重复元素,其中真正不同的排列数应为 ,即其重复度为ni! 同理a1重复了n1次,a2重复了n2次,····,ak重复了nk次,n1+n2+····+nk=n. 对于这样的n个元素进行全排列,可得

hdu1521:排列组合---指数型母函数

题意: n种元素,每种有 ni个,选出 m 个的排列有多少种 题解: 指数型母函数的裸题 x^n 项的系数为  an/n!.... 代码如下: #include <iostream> #include <stdio.h> #include<string.h> #include<algorithm> #include<string> #include<ctype.h> using namespace std; #define MAXN

HDU1521 排列组合 (指数型母函数)

题意:n,m,有n种物品每个物品有a[i]个,要求从中选出m件物品的排列数. 指数型母函数,g=a0+a1/1!*x+a2/2!*x^2+...+ak/k!*x^k... 指数型母函数详解 #include <iostream> #include <stdio.h> #include <string.h> #include<string> #include<math.h> #include<queue> #include<sta

HDU 1521 排列组合

Problem Description 有n种物品,并且知道每种物品的数量.要求从中选出m件物品的排列数.例如有两种物品A,B,并且数量都是1,从中选2件物品,则排列有"AB","BA"两种. Input 每组输入数据有两行,第一行是二个数n,m(1<=m,n<=10),表示物品数,第二行有n个数,分别表示这n件物品的数量. Output 对应每组数据输出排列数.(任何运算不会超出2^31的范围) Sample Input 2 2 1 1 Sample

HDU 1521 排列组合 搜索

排列组合 Problem Description 有n种物品,并且知道每种物品的数量.要求从中选出m件物品的排列数.例如有两种物品A,B,并且数量都是1,从中选2件物品,则排列有"AB","BA"两种. Input 每组输入数据有两行,第一行是二个数n,m(1<=m,n<=10),表示物品数,第二行有n个数,分别表示这n件物品的数量. Output 对应每组数据输出排列数.(任何运算不会超出2^31的范围) Sample Input 2 2 1 1 Sa