HDU 1521 排列 指數母函式
阿新 • • 發佈:2019-02-17
題目:http://acm.hdu.edu.cn/showproblem.php?pid=1521
有n種物品,並且知道每種物品的數量。要求從中選出m件物品的排列數。例如有兩種物品A,B,並且數量都是1,從中選2件物品,則排列有"AB","BA"兩種。思路:指數型母函式模板題。
#include<iostream> #include<string.h> #include<stdio.h> using namespace std; int jc(int s) { int ans=1; for (int i = 1; i <= s; i++) ans *= i; return ans; } int main() { int a[15];double c1[15], c2[15]; int m, n,i,j; while (cin >> n >> m) { memset(c1, 0, sizeof(c1)); memset(c2, 0, sizeof(c2)); for (i = 1; i <= n; i++) cin >> a[i]; for (i = 0; i <= a[1]; i++) c1[i] = 1.0 / jc(i);//先把分母也當做係數包含進去 for (i = 2; i <= n; i++) { for(j=0;j<=m;j++) for (int k = 0; k + j <= m&&k <= a[i]; k++) c2[j + k] +=1* c1[j]/jc(k);//把第k項係數包含進去,如x^3/3!*x^2/2! for (j = 0; j <= m; j++) { c1[j] = c2[j]; c2[j] = 0; } } printf("%.0f\n", c1[m]*jc(m)); } return 0; }