HDU1521 排列组合【指数型母函数】
原创
©著作权归作者所有:来自51CTO博客作者ITCharge的原创作品,请联系作者获取转载授权,否则将追究法律责任
题目链接:
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个元素中取r个排列,求不同的排列数。
AC代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
double f[] = {1,1,2,6,24,120,720,5040,40320,362880,3628800};
double num[11],c1[11],c2[11];
int main()
{
int N,M;
while(cin >> N >> M)
{
memset(c1,0,sizeof(c1));
memset(c2,0,sizeof(c2));
for(int i = 0; i < N; ++i)
cin >> num[i];
for(int i = 0; i <= num[0]; ++i)
c1[i] = 1.0/f[i];
for(int i = 1; i < N; ++i)
{
for(int j = 0; j <= M; ++j)
for(int k = 0; k <= num[i] && (k+j)<=M; ++k)
c2[k+j] += (c1[j]/f[k]);
for(int j = 0; j <= M; ++j)
{
c1[j] = c2[j];
c2[j] = 0;
}
}
double s = 1.0*c1[M]*f[M];
printf("%.0lf\n",s);
}
return 0;
}