Combinatorics——HDUOJ 1521

来源:互联网 发布:js invalid signature 编辑:程序博客网 时间:2024/05/17 23:49

原题

  • 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 Output

    2

解题思路:

对于指数型母函数可参考:http://blog.csdn.net/moringrain/article/details/48491273

此题有点类似于多重集合的排列组合,即:

设多重集合S = { n1 * a1, n2 * a2, …, nk * ak }; n = n1 + n2 + … + nk
即集合 S 中含有n1个元素a1, n2个元素a2,…,nk个元素ak,ni被称为元素ai的重数,k成为多重集合的类别数
在 S 中任选 r 个元素的排列称为S的r排列,当r = n时,有公式 1:A( n ; n1×a1, n2×a2, …, nk×ak ) = n! / ( n1! × n2! ×…× nk! )

对于此题:

  • 如果选择的物体的数量等于所有物体的总数量,则可以用以上多重集合公式
  • 如果选择的物体的数量少于所有物体的总数量,则只能用指数型母函数 或者 DFS搜索

代码:

#include<stdio.h>#include <cstring>double c1[11], c2[11];int N[11];int A(int n)//n的全排列{    int i, sum = 1;    for (i = n; i > 0; i--)        sum *= i;    return sum;}void Calculate(int n, int m){    memset(c1, 0, sizeof(c1));    memset(c2, 0, sizeof(c2));    int i, j, k;    for (i = 0; i <= 10; i++){        c1[i] = 0;        c2[i] = 0;    }    for (i = 0; i <= N[1]; i++)//初始化第一个括号里的系数        c1[i] = 1.0 / A(i);    for (i = 2; i <= n; i++){//从第二个括号开始 ×        for (j = 0; j <= m; j++)            for(k = 0; k + j <= m && k <= N[i]; k++)                c2[k + j] +=  c1[j]/ A(k);        for (j = 0; j <= m; j++){            c1[j] = c2[j];            c2[j] = 0;        }    }}int main(){    int n, m;    int i;    while (scanf("%d%d",&n,&m)!=EOF)    {        memset(N, 0, sizeof(N));        for (i = 1; i <= n; i++)            scanf("%d", &N[i]);        Calculate(n, m);        printf("%.0lf\n", c1[m] * A(m));    }}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 喝了啤酒肚子撑怎么办 小孩把口香糖吞进肚子怎么办 臂力器手柄坏了怎么办 30臂力棒掰不动怎么办 杯子盖子拧紧了打不开怎么办 深蹲以后腿软怎么办 小孩摔跤破皮了怎么办 手机qq账号密码忘了怎么办 刚满月宝宝喷奶怎么办 两个月的宝宝不爱吃奶怎么办 仓鼠走路画圈了怎么办 力气大但扳手腕不行怎么办 只睡了两个小时怎么办 微博账号被冻结了怎么办 微博一天多次解冻怎么办 肿瘤对化疗不敏感怎么办 2个月宝宝肺炎怎么办 小孩咳嗽2个月怎么办 两个月的小孩子气管炎怎么办? 小孩子两个月发烧38度怎么办 两个月的小孩子咳嗽怎么办 5个月宝宝吃奶少怎么办 26岁的1型糖尿病怎么办 睡前吃得太饱怎么办 胰岛素2小时>300怎么办 血清c肽测定高怎么办 体测蛋白质和骨骼肌偏高怎么办 半个月重了十斤怎么办 月经停了2个月怎么办 在练腹肌中腹痛怎么办 越练肌肉越肥怎么办 喘不过气来 心闷怎么办 被气得喘不过气怎么办 健身完头晕想吐怎么办 吃多了反胃头晕怎么办 合同未约定退货货物积压怎么办 运动内衣把胸压平怎么办 经常穿皮鞋脚臭怎么办 买衣服胸围小了怎么办 内衣下胸围太紧怎么办 穿文胸衣服要开怎么办