唉。。看题解过的。。。
View Code
1 /* 2 题意: 3 给定n个人,求组队的方法数。 4 关键:首先要分情况,1个队,2个队,3个队。。。 5 递推: 6 a[ i ][ j ]:前i个人分成j个队的方法数。 7 a[i][j] = a[i-1][j-1](第i个人自成一队)+a[i-1][j]*j(第i个人加入了j个队中的某个队); 8 */ 9 #include<stdio.h> 10 #include<string.h> 11 #include<stdlib.h> 12 #include<algorithm> 13 #include<iostream> 14 #include<queue> 15 #include<vector> 16 #include<map> 17 #include<math.h> 18 typedef long long ll; 19 //typedef __int64 int64; 20 const int maxn = 25; 21 const int maxm = 25; 22 const int inf = 0x7FFFFFFF; 23 const double pi = acos(-1.0); 24 const double eps = 1e-8; 25 using namespace std; 26 ll a[ maxn ][ maxm ]; 27 void init(){ 28 memset( a,0,sizeof( a ) ); 29 a[ 1 ][ 1 ] = 1; 30 for( int i=2;i<maxn;i++ ){ 31 for( int j=1;j<=i;j++ ){ 32 if( j==1||j==i ) a[i][j] = 1; 33 else a[i][j] = a[i-1][j-1]+a[i-1][j]*j; 34 } 35 } 36 } 37 int main(){ 38 int ca; 39 scanf("%d",&ca); 40 init(); 41 while( ca-- ){ 42 int n; 43 scanf("%d",&n); 44 ll ans = 0; 45 for( int i=1;i<=n;i++ ) 46 ans += a[n][i]; 47 printf("%I64d\n",ans); 48 } 49 return 0; 50 }