题意:
有n种物品,并且知道每种物品的数量。要求从中选出m件物品的排列数。
思路:
G(x) = (1+x/1!+x^2/2!+...+x^a1/a1!) * (1 + x/1! + x^2/2! + ... + x^a2/a2!) *...*(1+x/1!+x^2/x!+...+x^an/an!)
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; double dp[2][100], jiecheng[100]; int n, m, a[100]; void init() { jiecheng[0] = 1; for (int i = 1; i <= 10; i++) jiecheng[i] = jiecheng[i-1] * i; } int main() { init(); while (~scanf("%d%d", &n, &m)) { for (int i = 0; i < n; i++) scanf("%d", &a[i]); for (int i = 0; i <= 10; i++) dp[0][i] = dp[1][i] = 0; for (int i = 0; i <= a[0]; i++) dp[0][i] = 1.0 / jiecheng[i]; for (int i = 1; i < n; i++) { int pre = (i - 1) % 2, cur = i % 2; for (int j = 0; j <= m; j++) { for (int k = 0; k <= a[i] && k <= j; k++) { dp[cur][j] += dp[pre][j-k] / jiecheng[k]; } } for (int i = 0; i <= 10; i++) dp[pre][i] = 0; } printf("%.0lf\n", dp[(n-1)%2][m] * jiecheng[m]); } return 0; }