集合划分问题

来源:互联网 发布:java游戏源码教程 编辑:程序博客网 时间:2024/06/05 21:16

2630: 集合划分问题 分享至QQ空间 去爱问答提问或回答

时间限制(普通/Java):1000MS/10000MS     内存限制:65536KByte
总提交: 152            测试通过:103

描述

n(0<n<=15)个元素的集合{1,2,……,n}可以划分为若干个非空子集。例如,当n=4时,集合{1,2,3,4}可以有15种不同的划分方法:
{{1},{2},{3},{4}}
{{1,2},{3},{4}}
{{1,3},{2},{4}}
{{1,4},{2},{3}}
{{2,3},{1},{4}}
{{2,4},{1},{3}}
{{3,4},{1},{2}}
{{1,2},{3,4}}
{{1,3},{2,4}}
{{1,4},{2,3}}
{{1,2,3},{4}}
{{1,2,4},{3}}
{{1,3,4},{2}}
{{2,3,4},{1}}
{{1,2,3,4}}

输入

每组数据输入包括1行,代表元素个数n。

输出

每组输出不同的非空子集划分数目。

样例输入

4
5

样例输出

15
52

思路:
组合数学里的贝尔数(Bell),自行百度即可。
#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>using namespace std;typedef long long int ll;ll Stirling(int n,int m){if ((m > n) ||(m == 0))         return 0;       if ((m == 1)||(m == n))          return 1;   return Stirling(n-1,m-1)+m*Stirling(n-1,m);}int main(){int N;while(~scanf("%d",&N)){ll ans = 0;for(int i=1; i<=N; i++)ans += Stirling(N,i);printf("%I64d\n",ans);}return 0;}

注:
2-8是本题的一个子问题。
分享一个链接学习一下
http://blog.csdn.net/acdreamers/article/details/12309269


0 0