- 给定,有递归关系
- 递推关系的说明:考虑第n个物品,n可以单独构成一个非空集合,此时前n-1个物品构成k-1个非空的不可辨别的集合, 方法数为S(n-1,k-1);也可以前n-1种物品构成k个非空的不可辨别的 集合,第n个物品放入任意一个中,这样有k*S(n-1,k)种方法。
#include<stdio.h>
#include<iostream>
#include<string>
#include<string.h>
#include<math.h>
#include<functional>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int maxn =105;
const int inf = 1<<30;//0x7f;
typedef __int64 LL;
int n,k;
double dp[maxn][maxn];
void getDP()
{
memset( dp,0,sizeof(dp) );
for( int i = 1; i < maxn; i ++ ){
dp[1][i] = 0;
dp[i][1] = 1;
}
for( int i = 2; i < maxn; i ++ ){
for( int j = 2; j <= i; j ++ ){
dp[i][j] = dp[i-1][j-1] + dp[i-1][j]*j;
}
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("data.txt","r",stdin);
#endif
getDP();
while( scanf("%d",&n) != EOF,n )
{
double ans = 0;
for( int i = 1; i <= n; i ++ )
ans += dp[n][i];
printf("%d %.0f\n",n,ans);
}
return 0;
}