【2-8】集合划分问题(给定要分成几个集合)
´问题描述:
n 个元素的集合{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,2,3,4}}由 1 个子集组成;集合{{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}}由 2 个子集组成;集合{{1,2},{3},{4}},{{1,3},{2},{4}},{{1,4},
{2},{3}},{{2,3},{1},{4}},{{2,4},{1},{3}},{{3,4},{1},{2}}由 3 个子集组
成;集合{{1},{2},{3},{4}}由 4 个子集组成。
´编程任务:
给定正整数 n 和 m,计算出 n 个元素的集合{1,2,, n }可以划分为多少个不同的由 m 个
非空子集组成的集合。
´数据输入:
由文件 input.txt 提供输入数据。文件的第 1 行是元素个数 n 和非空子集数 m。
´结果输出:
程序运行结束时,将计算出的不同的由m个非空子集组成的集合数输出到文件output.txt
中。
输入文件示例 输出文件示例
input.txt output.txt
4 3 6
【题解】
这是第二类Stirling数。 递推公式f[n][m] = f[n-1][m-1]+m*f[n-1][m] f[0][0] = 1;【代码】
#include <cstdio>
using namespace std;
const int N = 100;
long long f[N+10][N+10];
int main(){
f[0][0] = 1;
for (int i = 1;i <= N;i++)
for (int j = 1;j <= i;j++){
f[i][j] = f[i-1][j-1]+j*f[i-1][j];
}
while (1){
int n,m;
scanf("%d%d",&n,&m);
printf("%I64d\n",f[n][m]);
}
return 0;
}