Ka的递归编程练习 Part3|集合划分啦

 1 #include<stdio.h>
 2 int ss(int n,int k)
 3 {
 4     if(n==k||k==1) return 1;
 5     return ss(n-1,k-1)+k*ss(n-1,k);    
 6 }
 7 int main()
 8 {
 9     int s,n,k;
10     scanf("%d%d",&n,&k);
11     n>=k?s=ss(n,k):s=-1;
12     printf("%d",s);
13     return 0;
14 }

集合的划分就是把一个集合的数拆成多个集合的组成,其中n为元素个数,k为集合数

具体的规则是

1、Sn∉∅;

2、Si∩Sj∈∅ (1≤i,j≤k   i≠j);

3、S1∪S2∪S3∪...∪Sk=S

样例输入 2 4

样例输出 7

 

分析:

返回条件的话,如果k=1,只能划分一个

如果k=n,每个放一个,也只有一种情况。

 

对于每组n、k:

第一种情况:先把一个元素a提取出来,剩下的n-1个元素进行集合划分,再把元素a放入一个集合中,然后因为这个元素a一共有k种放法,所以总共的分法是k*s(n-1,k)

第二种情况:把元素a单独放入一个集合,剩下的进行集合划分,所以分法师s(n-1,k-1)

 

以上~

posted on 2015-05-09 17:07  Ricochet!  阅读(225)  评论(0编辑  收藏  举报