标签:
题目链接:
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; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/lianai911/article/details/47729559