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)
以上~
时间: 2024-10-28 15:19:47