1315 例4 5 集合的劃分

2021-10-02 11:48:15 字數 1303 閱讀 4925

1315:【例4.5】集合的劃分

時間限制: 1000 ms         記憶體限制: 65536 kb

【題目描述】

設s是乙個具有n個元素的集合,s=〈a1,a2,……,an〉,現將s劃分成k個滿足下列條件的子集合s1,s2,……,sk ,且滿足:

1.si≠∅

2.si∩sj=∅  (1≤i,j≤k,i≠j)

3.s1∪s2∪s3∪…∪sk=s

則稱s1,s2,……,sk是集合s的乙個劃分。它相當於把s集合中的n個元素a1,a2,……,an放入k個(0<k≤n<30)無標號的盒子中,使得沒有乙個盒子為空。請你確定n個元素a1,a2,……,an放入k個無標號盒子中去的劃分數s(n,k)。

【輸入】

給出n和k。

【輸出】

n個元素a1,a2,……,an放入k個無標號盒子中去的劃分數s(n,k)。

【輸入樣例】

10 6

【輸出樣例】

22827

【**】

no【演算法分析】

對於任乙個元素an,則必然出現以下兩種情況:    

1、{an}是k個子集中的乙個,於是我們只要把a1,a2,……,an-1 劃分為k-1子集,便解決了本題,這種情況下的劃分數共有s(n-1,k-1)個;     

2、{an}不是k個子集中的乙個,則an必與其它的元素構成乙個子集。則問題相當於先把a1,a2,……,an-1 劃分成k個子集,這種情況下劃分數共有s(n-1,k)個;然後再把元素an加入到k個子集中的任乙個中去,共有k種加入方式,這樣對於an的每一種加入方式,都可以使集合劃分為k個子集,因此根據乘法原理,劃分數共有k * s(n-1,k)個。

綜合上述兩種情況,應用加法原理,得出n個元素的集合{a1,a2,……,an}劃分為k個子集的劃分數為以下遞迴公式:s(n,k)=s(n-1,k-1) + k * s(n-1,k) (n>k,k>0)。    

下面,我們來確定s(n,k)的邊界條件,首先不能把n個元素不放進任何乙個集合中去,即k=0時,s(n,k)=0;也不可能在不允許空盒的情況下把n個元素放進多於n的k個集合中去,即k>n時,s(n,k)=0;再者,把n個元素放進乙個集合或把n個元素放進n個集合,方案數顯然都是1,即k=1或k=n時,s(n,k)=1。

因此,我們可以得出劃分數s(n,k)的遞迴關係式為:

s(n,k)=s(n-1,k-1) + k * s(n-1,k)      (n>k,k>0)

s(n,k)=0                         (nusing namespace std;

long long s(int n,int k)

1315 例4 5 集合的劃分

這題感覺還是很難得,要注意點 a 函式s返回值是long long型 因為可能種模擬較多 b 來說一下這個遞迴函式 1.n2.n k 和 k 1 相等說明每個子集合只有乙個元素,k 1說明只有乙個集合所有它要包含所有的元素,因為並集是s 3 分倆總情況 是k子集合中的乙個,於是我們只要把a1,a2,...

1315 例4 5 集合的劃分

題目描述 設s是乙個具有n個元素的集合,s a1,a2,an 現將s劃分成k個滿足下列條件的子集合s1,s2,sk 且滿足 1 si 2 si sj 1 i,j k,i j 3 s1 s2 s3 sk s 則稱s1,s2,sk是集合s的乙個劃分。它相當於把s集合中的n個元素a1,a2,an 放入k個...

例4 5 集合的劃分

時間限制 1000 ms 記憶體限制 65536 kb 提交數 218 通過數 158 題目描述 設s是乙個具有n個元素的集合,s 現將s劃分成k個滿足下列條件的子集合s1,s2,sk 且滿足 1 si 2 si sj 1 i,j k i j 3 s1 s2 s3 sk s 則稱s1,s2,sk是集...