> 文档中心 > C++ 集合的划分

C++ 集合的划分

【问题描述】
设S是一个具有n个元素的集合,S={a1,a2,……,an},现将S划分成k个满足下列条件的子集合S1,S2,……,Sk ,且满足:

C++ 集合的划分
则称S1,S2,……,Sk是集合S的一个划分。它相当于把S集合中的n个元素a1 ,a2,……,an 放入k个(0<k≤n<30)无标号的盒子中,使得没有一个盒子为空。请你确定n个元素a1 ,a2 ,……,an 放入k个无标号盒子中去的划分数S(n,k)。

举例说明:

S={1,2,3,4},k=3
共6种不同的划分方案,即划分数S(4,3)=6。具体划分方案是:

第一种:{1,2}、{3}、{4}

第二种:{1,3}、{2}、{4}

第三种:{1,4}、{2}、{3}

第四种:{2,3}、{1}、{4}

第五种:{2,4}、{1}、{3}

第六种:{3,4}、{1}、{2}

【输入格式】
输入两个整数(空格隔开),分别表示n和k

【输出格式】
输出一个整数,表示总的划分数

【输入样例1】

10 6

【输出样例1】

22827

【输入样例2】

23 7

【输出样例2】

4382641999117305

code

#includeusing namespace std;long long gather(int n_0,int k_0){if(n_0<k_0 || k_0==0) return 0;if(k_0==n_0 || k_0==1) return 1;return gather(n_0-1,k_0-1)+k_0*gather(n_0-1,k_0);}int main(){  int n,k;  cin>>n>>k;  cout<<gather(n,k);  return 0;}

在这里插入图片描述

天天赞天天看!!!