time limit: 3 second
memory limit: 2 mb
問題描述:
n 個元素的集合可以劃分為若干個非空子集。例如,當n=4 時,集合可以劃分為15 個不同的非空子集如下:
,,,},
,,},
,,},
,,},
,,},
,,},
,,},
,},
,},
,},
,},
,},
,},
,},
} 其中,集合} 由1 個子集組成;集合,},,},,},,},,},,},,} 由2 個子集組成;集合,,},,,},, ,},,,},,,},,,} 由3 個子集組成;集合,,,} 由4 個子集組成。
程式設計任務:
給定正整數n 和m,計算出n 個元素的集合可以劃分為多少個不同的由m 個非空子集組成的集合。
>
輸入檔案僅一行,輸入元素個數n 和非空子集數m。
將計算出的不同的由m個非空子集組成的集合數
4 3
6【題解】
對於集合的第n個元素。它有兩種情況。第一種,自身乙個元素作為集合。第二種,與其他元素合在乙個集合中。
對於第一種情況。問題轉化為n-1個元素。劃分為m-1個集合的情況。
對於第二種情況。問題轉化為n-1個元素。劃分為m個集合的情況。然後第n個元素可以加入到前n-1個元素組成的m個集合中的任意乙個集合。
即f[n][m] = f[n-1][m-1]+f[n-1][m]*m;
當n==m時f[n][m] = 1;
當m>n時,f[n][m]=0;
當m < 1時,f[n][m]==0(當然 如果n==m==0則f[n][m] = 1)
不用擔心這樣組成的集合會重複。
因為只有後面的元素才會主動去找前面的元素構成集合。前面的元素是不會主動找到後面的元素的!這就滿足了組合的定義。
假設xy選擇與前面的元素構成集合。
x選擇自身乙個元素。
那麼這時x就不是自身乙個了。可以是x和y在一起。
但是不用擔心x不能選擇自身乙個。
因為y也可以選擇是自身乙個。這種情況下。
x也就可以選擇自身乙個了。
就這樣吧。不要去鑽牛角尖。要大膽地想。
【**】
#include int nn, mm;
void input_data()
__int64 stirling(int n, int m)
int main()
2 7 集合劃分問題
問題描述 n 個元素的集合可以劃分為若干個非空子集。例如,當 n 4 時,集合可以劃分為 15 個不同的非空子集如下 程式設計任務 給定正整數 n,計算出 n 個元素的集合可以劃分為多少個不同的非空子集。資料輸入 由檔案 input.txt 提供輸入資料。檔案的第 1 行是元素個數 n。結果輸出 程...
例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是集...
2 8 集合劃分問題 給定要分成幾個集合
問題描述 n 個元素的集合可以劃分為若干個非空子集。例如,當 n 4 時,集合可以劃分為 15 個不同的非空子集如下 其中,集合 由 1 個子集組成 集合,由 2 個子集組成 集合,由 3 個子集組 成 集合,由 4 個子集組成。程式設計任務 給定正整數 n 和 m,計算出 n 個元素的集合可以劃分...