首页 > ACM题库 > HDU-杭电 > HDU 1521 排列组合-母函数-[解题报告] C++
2013
12-12

HDU 1521 排列组合-母函数-[解题报告] C++

排列组合

问题描述 :

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

输入:

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

输出:

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

样例输入:

2 2
1 1

样例输出:

2

/*

 

题意:中文题 ... 指数型母函数详解神牛博文 : http://hi.baidu.com/nicker2010/item/fea0a5254208a30377272ced 

 

*/

#include<iostream> #include<cmath> using namespace std; #define manx 13 double a[manx],b[manx];   /// a[] 代表第一个式子的系数 long long num[manx]; long long fan(int n){     long long sum=1;     for(int i=1;i<=n;i++)         sum *= i;     return sum; } int main(){     int n,m;     while(cin>>n>>m){         memset(b,0,sizeof(b));         memset(a,0,sizeof(a));         for(int i=0;i<n;i++)             cin>>num[i];         for(int i=0;i<=num[0];i++)               a[i] = 1.0/fan(i);         for(int i=1;i<n;i++){  /// 从第二个式子开始...             for(int j=0;j<manx;j++) /// 第一个式子 x^j,系数是 a[j]...                 for(int k=0;k<=num[i]&&k+j<manx;k++){ /// 第二个式的 x^k ,x^K的系数是 1                      b[j+k] += a[j]/fan(k);                 }             for(int j=0;j<manx;j++){                 a[j] = b[j];                 b[j] = 0;             }         }         printf("%.lf\n",a[m]*fan(m));  /// 组合数学     } }

解题报告转自:http://blog.csdn.net/math_coder/article/details/8443200


  1. 第2题,TCP不支持多播,多播和广播仅应用于UDP。所以B选项是不对的。第2题,TCP不支持多播,多播和广播仅应用于UDP。所以B选项是不对的。

  2. 很高兴你会喜欢这个网站。目前还没有一个开发团队,网站是我一个人在维护,都是用的开源系统,也没有太多需要开发的部分,主要是内容整理。非常感谢你的关注。

  3. “再把所有不和该节点相邻的节点着相同的颜色”,程序中没有进行不和该节点相邻的其他节点是否相邻进行判断。再说求出来的也不一样是颜色数最少的