hdu1521 指数型母函数 求解多重集排列数
题意是给你n个物品, 每个物品有ai个, 从中选取m个物品的排列数是多少??这个问题可以使用指数型母函数来解决。。代码如下:
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> using namespace std; int f[15]; void initf() { f[0] = 1; for(int i=1; i<=11; i++) f[i] = i*f[i-1]; } int n, m; //n个物品选出m件 int a[20]; //每件物品的数量 double c1[20], c2[20]; int main() { initf(); while(cin>>n>>m) { for(int i=1; i<=n; i++) cin>>a[i]; memset(c2, 0, sizeof(c2)); memset(c1, 0, sizeof(c1)); for(int i=0; i<=a[1]; i++) c1[i]=1.0/f[i]; for(int i=2; i<=n; i++) { for(int j=0; j<=10; j++) for(int k=0; k<=a[i]; k++) if(j+k<=10) c2[j+k] += c1[j]/f[k]; for(int j=0; j<=10; j++) c1[j]=c2[j], c2[j]=0; } //cout<<(int)c1[m]*f[m]<<endl; printf("%.0f\n", c1[m]*(double)f[m]); } return 0; }