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是集...