1. 程式人生 > >HDU 1521 排列組合

HDU 1521 排列組合

pro long sizeof strong += sin string space pre

Problem Description 有n種物品,並且知道每種物品的數量。要求從中選出m件物品的排列數。例如有兩種物品A,B,並且數量都是1,從中選2件物品,則排列有"AB","BA"兩種。 Input 每組輸入數據有兩行,第一行是二個數n,m(1<=m,n<=10),表示物品數,第二行有n個數,分別表示這n件物品的數量。 Output 對應每組數據輸出排列數。(任何運算不會超出2^31的範圍) Sample Input 2 2 1 1 Sample Output 2 指數型母函數模板題
 1 #include<iostream>
 2
#include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 double a[12],b[12]; 8 long long fac[12]; 9 int d[12],n,m; 10 int main() 11 {int i,j,k; 12 while (cin>>n>>m) 13 { 14 memset(a,0,sizeof(a));
15 memset(b,0,sizeof(b)); 16 for (i=1;i<=n;i++) 17 scanf("%d",&d[i]); 18 fac[0]=1; 19 for (i=1;i<=10;i++) 20 fac[i]=fac[i-1]*i; 21 a[0]=1; 22 for (i=1;i<=n;i++) 23 { 24 memset(b,0,sizeof(b)); 25 for (j=0;j<=d[i];j++) 26 { 27
for (k=0;k<=m-j;k++) 28 b[k+j]+=a[k]/(double)fac[j]; 29 } 30 memcpy(a,b,sizeof(b)); 31 } 32 printf("%.0lf\n",a[m]*fac[m]); 33 } 34 }

HDU 1521 排列組合