【題目描述】 設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