1315:【例4.5】集合的划分
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 20961 通过数: 10173
【题目描述】
设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
不太好理解,其中一个盒子中放一个有(x-1,y-1)种方法,其中一个盒子中不放一个,有y种放法乘数放在固定一个盒子中的方法y*(x-1,y);(即少一个数后,再放在y个盒子中的方法)
#include<bits/stdc++.h>
using namespace std;
long long sum(int x,int y)
{
if(x<y||y==0) return 0;//如果是0个,或是没够分的(x小于y)
if(x==y||y==1) return 1;//如果x==y,或是一个集合
return sum(x-1,y-1)+y*sum(x-1,y);//其中一个盒子中放一个,和其中一个盒子中不放一个(有y种放法)
}
int main()
{
int n,k;
scanf("%d %d",&n,&k);
printf("%lld",sum(n,k));
return 0;
}