本文主要是介绍组合数学:贝尔数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
B n是 基数为 n的 集合划分数目。 集合 S的一个划分是定义为 S的两两不相交的非空 子集的族,它们的并是 S。例如 B 3 = 5因为3个 元素的集合{ a, b, c}有5种不同的划分方法:
- {{ a}, { b}, { c}}
- {{ a}, { b, c}}
- {{ b}, { a, c}}
- {{ c}, { a, b}}
- {{a, b, c}}
当3个元素时有5种三个元素都存在的集合
S (P ,K )=S (P -1,K -1)+K *S (P -1,K );

代码:
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;const int N=2001;
int data[N][N];
int sum[N];
void compute(){memset(data,0,sizeof(data));memset(sum,0,sizeof(sum));data[1][1]=1;sum[1]=1;for (int i = 2; i < N; ++i){for (int j = 1; j <= i ; ++j){data[i][j]=data[i-1][j-1]+j*data[i-1][j];sum[i]+=data[i][j];}}
}
int main(){int T;scanf("%d",&T);compute();for(int i = 0 ; i < T ; i++){int m;scanf("%d",&m);printf("%d\n",sum[m]);}return 0;
}
sum[n]为结果集,sum[3]为三个元素时集合划分种类;
这篇关于组合数学:贝尔数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!