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

来源:互联网 发布:js 淘宝左侧 分类导航 编辑:程序博客网 时间:2024/05/16 07:59

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

指数型母函数:

#include<iostream>   #include <cstring>using namespace std;  #define maxn 100   int a[maxn],num[maxn];double c1[maxn],c2[maxn];  void init()//指数型母函数 {  a[0]=1;a[1]=1;    for(int i=2;i<=maxn;i++){    a[i]=a[i-1]*i;     }}  int main()  {      init();      int n,m;    while(cin>>n>>m){    for(int i=1;i<=n;i++){    cin>>num[i];    }    memset(c1,0,sizeof c1);    memset(c2,0,sizeof c2);    for(int i=0;i<=num[1];i++){    c1[i]=1.0/a[i];    }    for(int i=2;i<=n;i++){    for(int j=0;j<=m;j++)    for(int k=0;k+j<=m&&k<=num[i];k++)    c2[j+k]+=c1[j]/a[k];        for(int j=0;j<=m;j++){    c1[j]=c2[j];    c2[j]=0;    }    }    printf("%.lf\n",c1[m]*a[m]);      }    return 0;  }



阅读全文
0 0
原创粉丝点击