题目:
思路:
设n个元素的集合可以划分F(n,m)个不同的由m个非空子集组成的集合
有三个元素时:
1.一个子集:{{1,2,3}} ,F(3,1)= 1
2.两个子集:{{1,2},{3}},{{1,3},{2}},{{2,3},{1}},F(3,2)= 3
3.三个子集:{{1},{2},{3}},F(3,3)=1
有四个元素时:
1.一个子集:{{1,2,3,4}},F(4,1)=1
2.两个子集:{{1,2,3},{4}},{{1,2,4},{3}},{{1,3,4},{2}},{{1,3},{2,4}},{{2,3,4},{1}},{{2,3},{1,4}},F(4,2)=7
3.三个子集:{{1,2},{3},{4}},{{1,3},{2},{4}},{{2,3},{1},{4}},{{1,4},{2},{3}},{{1},{2,4},{3}},{{1},{2},{3,4}},F(4.3)=6
4.四个子集:{{1},{2},{3},{4}},F(4,4)=1
根据规律可得公式:
F(n,m)=F(n-1,m-1)+m*F(n-1,m) 当m=1或n=m时,F(n,m)=1
代码在这里~:
#include <iostream>
#include <bits/stdc++.h>
using namespace std;//集合划分问题
int hua(int n, int m)
{
if(m==1||n==m)
return 1;
else
return hua(n-1,m-1)+m*hua(n-1,m);
}
int main()
{
ifstream fin("stir10.in",ios::in);
ofstream fout("answer10.txt");
int n,m;
fin>>n>>m;
int count1;
count1=hua(n,m);
fout << count1;
fout.close();
fin.close();
return 0;
}