問題描述:
設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);
}