问题
设S是一个具有n个元素的集合,S={a1,a2,……,an},现将S划分成k个满足下列条件的子集合S1,S2,……,Sk ,且满足:
则称S1,S2,……,Sk是集合S的一个划分。它相当于把S集合中的n个元素a1 ,a2,……,an 放入k个(0<k≤n<30=无标号的盒子中,使得没有一个盒子为空。请你确定n个元素a1 ,a2 ,……,an 放入k个无标号盒子中去的划分数S(n,k)。
输入样例
10 6
输出样例
22827
思路
1.分情况:
(1){an}为k个子集中的一个,将第1~n-1项划分为k-1个子集,划分数有S(n-1,k-1)个
(2){an}不是k个子集中的一个,一定与其他元素构成子集。先将1~n-1个元素划分为k个子集,然后再将{an}放入,划分数有k*S(n-1,k)个
2.写递归关系:
S(n,k)=S(n-1,k-1)+k*S(n-1,k) (n>k,k>0)
S(n,k)=0 (n<k)or(k=0)
S(n,k)=1 (k=1)or(k=n)
#include<iostream>
#include<cstdio>
using namespace std;
int s(int n,int k)
{
if(n<k||k=0)
return 0;
if(k=1||k==n)
return 1;
return s(n-1,k-1)+k*s(n-1,k);
}
int main()
{
int n,k;
cin>>n>>k;
cout<<s(n,k);
return 0;
}