hdu(1521)——排列组合

来源:互联网 发布:淘宝店招全屏显示 编辑:程序博客网 时间:2024/06/03 21:46

题意:

Problem Description
有n种物品,并且知道每种物品的数量。要求从中选出m件物品的排列数。例如有两种物品A,B,并且数量都是1,从中选2件物品,则排列有"AB","BA"两种。
 

Input
每组输入数据有两行,第一行是二个数n,m(1<=m,n<=10),表示物品数,第二行有n个数,分别表示这n件物品的数量。
 

Output
对应每组数据输出排列数。(任何运算不会超出2^31的范围)


思路:
这道题是一道指数型母函数的题。也就是说它是一道用来求排列数的问题。
直接套模板。。
这里用了double型。可能会存在精度误差。。
#include<cstdio>#include<cstring>#include<map>#include<set>#include<cmath>#include<algorithm>#include<vector>#include<queue>#include<stack>#include<iostream>using namespace std;typedef __int64 ll;typedef unsigned __int64 ULL;#define inf 99999999#define maxn 15double c1[maxn],c2[maxn];int a[maxn];double Factorial(double x){    double ans=1.0;    for(int i=1;i<=x;i++){        ans=ans*i;    }    return ans;}int main(){    int n,m;    while(~scanf("%d%d",&n,&m)){        memset(c1,0,sizeof(c1));        memset(c2,0,sizeof(c2));        for(int i=0;i<n;i++){            scanf("%d",&a[i]);        }        for(int i=0;i<=a[0];i++){            c1[i]=1.0/Factorial(1.0*i);        }        for(int i=1;i<n;i++){            for(int j=0;j<=n;j++){                for(int k=0;k+j<=n&&k<=a[i];k++){                    c2[j+k]+=c1[j]/Factorial(k*1.0);                }            }            for(int j=0;j<=n;j++){                c1[j]=c2[j];                c2[j]=0;            }        }        printf("%.0f\n",c1[m]*Factorial(m));    }    return 0;}


0 0