集合的劃分

問題描述:
設S是一個具有n個元素的集合,S={a1,a2,...,an},現將S劃分成k個滿足下列條件的子集S1,S2,...,Sk,且滿足:
Si≠空集
Si∩Sj=空集(1<=i,j<=k i≠j)
S1∪S2∪...∪Sk=S
則稱S1、S2,...,Sk是集合S的一個劃分。它相當於把S集合中的n個元素a1,a2,...,an放入k個i(0<k<=n<30)無標號的盒子中,使得沒有一個盒子爲空。請你確定n個元素a1,a2,...,an放入k個無標號盒子中去的劃分數S(n,k)。
輸入樣例:setsub.in
23 7
輸出樣例:setsub.out
4382641999117305

完整程序:

#include<iostream>
using namespace std;
//集合的劃分
long long S(int n,int k)//數據還有可能越界,請用高精度計算
{
    if(n<k||k==0)return 0;//滿足邊界條件,退出
    if(k==n||k==1)return 1;
    return S(n-1,k-1)+k*S(n-1,k); //調用下一層遞歸
}
int main()
{
    int n,k;
    cout<<"請輸入數據個數:"<<endl;
    cin>>n;
    cout<<"請輸入需要劃分的組數:"<<endl;
    cin>>k;
    cout<<n<<"個數據劃分爲"<<k<<"組總共的劃分數爲:"<<endl;
    cout<<S(n,k);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章