【例4.5】集合的划分

时间限制: 1000 ms 内存限制: 65536 KB
提交数: 218 通过数: 158
【题目描述】
设S是一个具有n个元素的集合,S={a1,a2,……,an},现将S划分成k个满足下列条件的子集合S1,S2,……,Sk ,且满足:
1.Si ≠ ∅
2.Si ∩ Sj = ∅ (1≤i,j≤k i≠j)
3.S1 ∪ S2 ∪ S3 ∪ … ∪ Sk = S
则称S1,S2,……,Sk是集合S的一个划分。它相当于把S集合中的n个元素a1 ,a2,……,an 放入k个(0<k≤n<30)无标号的盒子中,使得没有一个盒子为空。请你确定n个元素a1 ,a2 ,……,an 放入k个无标号盒子中去的划分数S(n,k)。
【输入】
给出n和k。
【输出】
n个元素a1 ,a2 ,……,an 放入k个无标号盒子中去的划分数S(n,k)。
【输入样例】
10 6
【输出样例】
22827

#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cstdlib>
#include<cstdio>
using namespace std;
typedef long long ll;
const int maxn = 101;
typedef long long ll;
ll cal(int n,int m)
{
  if((n < m)||(m == 0)) return 0;
  else if((m == 1)||(m ==n)) return 1;
  return cal(n-1,m-1)+m*cal(n-1,m);
}

int main()
{
  int n,m;
  scanf("%d%d",&n,&m);
  cout<<cal(n,m);
  return 0;
}
posted @ 2017-11-02 15:45  rsqppp  阅读(365)  评论(0)    收藏  举报