有n种物品,并且知道每种物品的数量。要求从中选出m件物品的排列数。例如有两种物品A,B,并且数量都是1,从中选2件物品,则排列有"AB","BA"两种。
2 2 1 1
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;
}