Description
对于一个有N个不同元素的集合 ,把其中元素划分到不同的子集当中有很多种划分方法。
比如{1,2} 可以划分成{{1},{2}} 或者{1,2} 两种划分方法
现在告诉你N,求有多少种划分方法
Input
第一行一个数Case(Case<=10000) 表示有多少组输入数据
以下有Case组数据:
每行一个整数N(N<=24),表示该集合内的元素有几个
Output
对于每组Case,输出一个整数表示该组有多少种不同划分方法
Sample Input
3
1
2
3
Sample Output
1
2
5
解题思路:
相当于把n个不同的小球放入n个相同的盒子中,允许空盒。
#include<iostream>
using namespace std;
const int D = 24;
long long pasca[D+1][D+1];
void init()
{
pasca[0][0] = 1;
for(int i=1;i<=D;++i)
{
pasca[i][0] = 0;
pasca[i][i] = 1;
pasca[i][1] = 1;
}
for(int i=3;i<=D;++i)
{
for(int j=2;j<i;++j)
pasca[i][j] = j*pasca[i-1][j]+pasca[i-1][j-1];
}
}
int main()
{
int T;
init();
cin>>T;
while(T--)
{
int n;
cin>>n;
long long ans = 0;
for(int i=1;i<=n;++i)
ans += pasca[n][i];
cout<<ans<<endl;
}
return 0;
}
最后欢迎大家访问我的个人网站: 1024s