問題描述:
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時,只有乙個元素...