题目:http://acm.hdu.edu.cn/showproblem.php?pid=1521
有n种物品,并且知道每种物品的数量。要求从中选出m件物品的排列数。例如有两种物品A,B,并且数量都是1,从中选2件物品,则排列有"AB","BA"两种。
思路:指数型母函数模板题。
#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
int jc(int s)
{
int ans=1;
for (int i = 1; i <= s; i++)
ans *= i;
return ans;
}
int main()
{
int a[15];double c1[15], c2[15];
int m, n,i,j;
while (cin >> n >> m)
{
memset(c1, 0, sizeof(c1));
memset(c2, 0, sizeof(c2));
for (i = 1; i <= n; i++)
cin >> a[i];
for (i = 0; i <= a[1]; i++)
c1[i] = 1.0 / jc(i);//先把分母也当做系数包含进去
for (i = 2; i <= n; i++)
{
for(j=0;j<=m;j++)
for (int k = 0; k + j <= m&&k <= a[i]; k++)
c2[j + k] +=1* c1[j]/jc(k);//把第k项系数包含进去,如x^3/3!*x^2/2!
for (j = 0; j <= m; j++)
{
c1[j] = c2[j];
c2[j] = 0;
}
}
printf("%.0f\n", c1[m]*jc(m));
}
return 0;
}