您的位置:首页 > 其它

集合划分问题

2017-05-27 17:04 183 查看

题目:

给定正整数n和m,计算出n个元素的集合可以划分为多少个不同的由m(m<=n)个不同的非空子集组成的集合。

思路:

对于n个元素的集合,可以划分成由m(1<=m<=n)个子集构成的子集,如 {{1},{2},{3},{4}}就是由4个子集构成的非空子集。假设f(n,m)表示将n个元素的集合划分成由m个子集构成的集合的个数。

那么可以这样来看:      

 1)若m==1,则f(n,m)=1;       

2)若n==m,则f(n,m)=1;    

3)若m==1,则f(n,m)=1;   

4)若非以上两种情况,f(n,m)可以由下面两种情况构成          

a.向n-1个元素划分成的m个集合里面添加一个新的元素,则有m*f(n-1,m)种方法;          

b.向n-1个元素划分成的m-1个集合里添加一个由一个元素形成的独立的集合,则有f(n-1,m-1)种方法。  

因此: f(n,m)=f(n-1,m-1)+m*f(n-1,m) 

#include <iostream>
using namespace std;
int q(int n,int m)
{
if(m<=n)
{
if(n==1 || n==m || m==1)
return 1;
else
return m*q(n-1,m)+q(n-1,m-1);
}
}
int main()
{
int n,m;
cin>>n>>m;
cout<<q(n,m)<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  集合划分问题