集合劃分問題 演算法

2021-07-29 18:22:13 字數 1318 閱讀 3614

問題描述:

n個元素的集合可以劃分為若干個非空子集。例如,當n=4 時,集合可以劃分為15個不同的非空子集如下:

,,,}, ,,},

,,}, ,,},

,,}, ,,},

,,}, ,},

,}, ,},

,}, ,},

,}, ,},

} 其中,集合} 由1個子集組成;集合,},,},,},,},,},,},,} 由2個子集組成;集合,,},,,},.,},,,},,,},,,} 由3 個子集組成;集合,,,} 由4個子集組成。

程式設計任務:

給定正整數n 和m,計算出n 個元素的集合可以劃分為多少個不同的由m 個

非空子集組成的集合。

資料輸入:

由檔案input.txt 提供輸入資料。檔案的第1 行是元素個數n 和非空子集數m。

結果輸出:

程式執行結束時,將計算出的不同的由m個非空子集組成的集合數輸出到檔案output.txt中。

輸入檔案示例                                        輸出檔案示例

4 3                                                 6

解題思路:設n個元素的集合可以劃分為f(n,m)個不同的由m個非空子集組成的集合。

f(1,1)=1;

f(2,1)=1,f(2,2)=1;

當有三個元素時:

乙個子集的情況:},f(3,1)=1;

兩個子集的情況:,},,},,},f(3,2)=f(2,1)+2*f(2,2)=3;

三個子集的情況:,,},f(3,3)=1。

當有四個元素時(即將元素4插入到三個元素分類的情況中):

乙個子集的情況:},f(4,1)=1;

兩個子集的情況:,},,},,},,},,},,},,},f(4,2)=f(3,1)+2*f(3,2)=7;

三個子集的情況:,,},,,},,,},,,},,,},,,},f(4,3)=f(3,2)+3*f(3,3)=6;

四個子集的情況:,,,},f(4,4)=1。

可得到遞推公式f(n,m)=f(n-1,m-1)+m*f(n-1,m),當m=1或n=m時f(n,m)=1。

#includeusing namespace std;

int f(int n, int m)

else

}int main()

集合劃分問題

集合劃分問題 問題描述 n 個元素的集合可以劃分為若干個非空子集。例如,當n 4 時,集合可以劃分為15 不同的非空子集如下 其中,集合 由 1 個子集組成 集合 由2 子集組成 集合,由3子集組 成 集合,由4 子集組成。程式設計任務 給定正整數n 和m,計算出n元素的集合可以劃分為多少 不同的由...

集合劃分問題

問題描述 n個元素的集合可以劃分為若干個非空子集。例如,當n 4 時,集合可以劃分為15 個不同的非空子集如下 給定正整數n,計算出n個元素的集合可以劃分為多少個不同的非空子集。所求的是bell 數 滿足遞推公式 b n 所以這道題實際求第二類stirling數 s n,m 解決思想 1.若 m 1...

集合劃分(遞迴演算法)

問題描述 n個元素的集合可以劃分為若干個非空子集。例如,當n 4 時,集合可以劃分為15 個不同的非空子集如下 給定正整數n,計算出n個元素的集合可以劃分為多少個不同的非空子集。其中設q n,m 表示n個數可以表示為m個非空子集。根據m和n的關係,可以分為以下情況 第一種情況 n 1時,只有乙個元素...