集合划分/Stirling(递归算法)

问题描述
n个元素的集合{1,2,3, …,n }可以划分为若干个非空子集。
例如,当n=3 时,集合{1,2,3}可以划分为5 个不同的非空子集的集合



而当n=5 时,集合{1,2,3,4,5}可以划分为52 个不同的非空子集如下:

集合划分/Stirling(递归算法)_第1张图片

星号*只是为了更加清楚

代码如下:

#include 

long fun(int n, int m)
{
	if((n == m) || (m == 1))
		return 1;
	if((m > n) || (m == 0))
		return 0;
	return m * fun(n - 1, m) + fun(n - 1, m - 1);

}

void main()
{
	int n, m, sum;
	scanf("%d%d", &n, &m);
	sum = fun(n, m);
	printf("%d",sum);
}

你可能感兴趣的:(算法)