Description:
有
n
n
种物品,并且知道每种物品的数量。要求从中选出件物品的排列数。例如有两种物品
A,B
A
,
B
,并且数量都是
1
1
,从中选件物品,则排列有
"AB","BA"
"
A
B
"
,
"
B
A
"
两种。
Solution:
指数型生成函数
#include <bits/stdc++.h>
using namespace std;
int n, m;
int a[11];
double fac[11], c1[11], c2[11];
int main() {
fac[0] = 1;
for(int i = 1; i <= 10; ++i) {
fac[i] = fac[i - 1] * i;
}
while(scanf("%d%d", &n, &m) != EOF) {
for(int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
}
for(int i = 0; i <= 10; ++i) {
c1[i] = 0.0;
c2[i] = 0.0;
}
for(int i = 0; i <= a[1]; ++i) {
c1[i] = 1.0 / fac[i];
}
for(int i = 2; i <= n; ++i) {
for(int j = 0; j <= m; ++j) {
for(int k = 0; k <= a[i] && k + j <= m; ++k) {
c2[j + k] += c1[j] / fac[k];
}
}
for(int j = 0; j <= m; ++j) {
c1[j] = c2[j];
c2[j] = 0;
}
}
printf("%.0f\n", c1[m] * fac[m]);
}
return 0;
}