集合划分:
给一个有 n 个元素的集合,将它划分为多个非空子集(可以包含自己),问有多少种划分?
4
15
输入为 n ,表示集合有n个元素
输出为15 ,表示有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}}
f(n,m),外面嵌套一个对 m 的 for 循环就可以了。f(n,m)=f(n-1,m-1)f(n,m)=m*f(n-1,m)#include
using namespace std;
long f(int n,int i) {//将n个数划分为i组 会有多少种划分??
if(i==1||n==i)//如果划分为n组 或者划分为1组 则均只有一种划分
return 1;
return f(n-1,i-1)+i*f(n-1,i);
//将n号元素单独为一组,剩下1~n-1个元素为i-1组
//不将n个元素单独为一组:
//将1~n-1个元素分为i组,将n号元素插入到其中某一组中去,
//插到哪组呢?有i种插法,因此需要乘i
}
int main() {
int n,sum=0;
cin>>n;
for(int i=1; i<=n; i++)
sum+=f(n,i);
cout<<sum;
}