集合的劃分

2021-07-11 20:54:36 字數 1331 閱讀 4488

【問題描述】

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

【輸入樣例】setsub.in

23 7

【輸出樣例】setsub.out

4382641999117305

【演算法分析】

先舉個例子,設s={1,2,3,4},k=3,不難得出s有6種不同的劃分方案,即劃分數s(4,3)=6,具體方案為:

{1,2}∪{3}∪{4} {1,3}∪{2}∪{4} {1,4}∪{2}∪{3}

{2,3}∪{1}∪{4} {2,4}∪{1}∪{3} {3,4}∪{1}∪{2}

考慮一般情況,對於任意的含有n個元素a1 ,a2,……,an的集合s,放入k個無標號的盒子中去,劃分數為s(n,k),我們很難憑直覺和經驗計算劃分數和列舉劃分的所有方案,必須歸納出問題的本質。其實對於任乙個元素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 (n

【參考程式】 

#include

using

namespace

std;

int s(int n, int k) //資料還有可能越界,請用高精度計算  

int main()

集合的劃分

尋物啟示 繼續找我的腦子,麻煩各位了 題目背景 公元2020年,一群科學家通過佩奇的遺傳基因轉殖出了許多佩奇,想讓她們去往不同的時空帶給小朋友們快樂 題目描述 設s是n只佩奇最開始所在的時空,s 現將s劃分成k個滿足下列條件的子時空是s1,s2,sk,且滿足 1 任何乙個時空中都必須有乙隻佩奇 2 ...

集合的劃分

問題描述 設s是乙個具有n個元素的集合,s a1,a2,an 現將s劃分成k個滿足下列條件的子集合s1,s2,sk 且滿足 則稱s1,s2,sk是集合s的乙個劃分。它相當於把s集合中的n個元素a1 a2,an 放入k個 0 k n 30 無標號的盒子中,使得沒有乙個盒子為空。請你確定n個元素a1 a...

集合的劃分 遞推)

時間限制 1 sec 記憶體限制 128 mb 提交 9 解決 8 提交 狀態 討論版 命題人 quanxing 設s是乙個具有n個元素的集合,s a1,a2,an s a1,a2,an 現將s劃分成k個滿足下列條件的子集合s1,s2,sks1,s2,sk 且滿足 1 si 2 si sj 1 i,...