1315:【例4.5】集合的劃分

【題目描述】
設S是一個具備n個元素的集合,S=⟨a1,a2,……,an⟩S=⟨a1,a2,……,an⟩,現將S劃分紅k個知足下列條件的子集合S1,S2,……,SkS1,S2,……,Sk ,且知足:

1.Si≠∅Si≠∅
2.Si∩Sj=∅Si∩Sj=∅            (1≤i,j≤k,i≠j1≤i,j≤k,i≠j)

3.S1∪S2∪S3∪…∪Sk=SS1∪S2∪S3∪…∪Sk=S
則稱S1,S2,……,SkS1,S2,……,Sk是集合S的一個劃分。它至關於把S集合中的n個元素a1,a2,……,ana1,a2,……,an 放入kk個(0<k≤n<300<k≤n<30)無標號的盒子中,使得沒有一個盒子爲空。請你肯定nn個元素a1,a2,……,ana1,a2,……,an 放入kk個無標號盒子中去的劃分數S(n,k)S(n,k)。

【輸入】
給出nn和kk。

【輸出】
nn個元素a1,a2,……,ana1,a2,……,an 放入kk個無標號盒子中去的劃分數S(n,k)S(n,k)。

【輸入樣例】
10 6

【輸出樣例】 22827
int long long s(int n,int k)
{
    if(k==0||(k>n))
        return 0;
    else if(k==1||n==k)
        return 1;
    else 
        return s(n-1,k-1)+k*s(n-1,k);
}
int main()
{
    int n,k;
    cin>>n>>k;
    cout<<s(n,k)<<endl;
}

劃分集合問題可當作是把n個元素放進k個盒子裏,每一個盒子都要有元素;spa

對於任意一個元素a,只可能有如下兩種狀況:code

1.a單獨在一個盒子裏,其餘n-1個元素放k-1個盒子:s(n-1,k-1)blog

2.在有元素的盒子裏放a,分兩步:n-1個元素(除去a)放進k個盒子=》s(n-1,k);再把a放進k個盒子=》k種狀況;由於這件事分爲兩步,因此兩個表達式相乘;遞歸

結束遞歸的條件:ci

1.不能把n個元素放進0個盒子裏,s(n,k)=0,k=0;class

2.不能把n個元素放進大於n個數的盒子,s(n,k)=0,k>n;集合

3.把n個元素放進n個盒子,與把n個元素放進1個盒子,都只有一種狀況啦,因此等於1;di

相關文章
相關標籤/搜索