问题1:集合划分
算法思想:对于n个元素的集合,可以划分为由m个子集构成的集合,例如{ {1,2}{3,4}}就是由2个子集构成的非空子集。假设f(n,m)表示将n个元素划分成由m个子集构成的集合的个数。那么1)若m == 1 , 则f(n,m)= 1 ;
2)若n == m ,则f(n,m)= 1 ;3)若不是上面两种情况则有下面两种情况构成:3.1)向n-1个元素划分成的m个集合里面添加一个新的元素,则有m*f(n-1,m)种方法;3.2)向n-1个元素划分成的m-1个集合里添加一个由一个元素形成的独立的集合,则有f(n-1,m-1)种方法。
实验代码:
#include<iostream>
#include<fstream>
using namespace std ;
int jihehuafen( int n , int m )
{
if( m == 1 || n == m )
return 1 ;
else
return jihehuafen( n - 1 , m - 1 ) + m*jihehuafen( n - 1 , m ) ;
}
int main()
{
ifstream fin("C:/input.txt") ;
ofstream fout("C:/output.txt") ;
int N , M , num ;
fin >> N >> M ;
num = jihehuafen( N , M) ;
fout << num << endl ;
<