集合划分#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
int n,m;
unsigned long f(int n,int m)
{
if((n==0)||(n==m)||(n==1)||(m==1))
return 1;
if (n<m) return 0;//边界处理
return f(n-1,m-1)+m*f(n-1,m);//返回段
}
int main()
{
cin>>n>>m;
cout<<f(n,m)<<endl;
return 0;
}
设n个元素的集合可以划分为F(n,m)个不同的由m个非空子集组成的集合。
F(n,m) = 1, when n=0|| n=m|| n=1||m=1
F(n,m) = 0, when n<m
否则
F(n,m)=F(n-1,m-1)+m*F(n-1,m)
例:
考虑3个元素的集合,可划分为
① 1个子集的集合:{{1,2,3}}
② 2个子集的集合:{{1,2},{3}},{{1,3},{2}},{{2,3},{1}}
③ 3个子集的集合:{{1},{2},{3}}
∴F(3,1)=1;F(3,2)=3;F(3,3)=1;
如果要求F(4,2)该怎么办呢?
A.往①里添一个元素{4},得到{{1,2,3},{4}}
B.往②里的任意一个子集添一个4,得到
{{1,2,4},{3}},{{1,2},{3,4}},
{{1,3,4},{2}},{{1,3},{2,4}},
{{2,3,4},{1}},{{2,3},{1,4}}
∴F(4,2)=F(3,1)+2*F(3,2)=1+2*3=7