集合劃分問題--貝爾數

問題描述:
n個元素的集合{1,2,, n }可以劃分爲若干個非空子集。例如,當n=4 時,集合{1,2,3,4}可以劃分爲15 個不同的非空子集如下:
{{1},{2},{3},{4}},
{{1,2},{3},{4}},
{{1,3},{2},{4}},
{{1,4},{2},{3}},
{{2,3},{1},{4}},
{{2,4},{1},{3}},
{{3,4},{1},{2}},
{{1,2},{3,4}},
{{1,3},{2,4}},
{{1,4},{2,3}},
{{1,2,3},{4}},
{{1,2,4},{3}},
{{1,3,4},{2}},
{{2,3,4},{1}},
{{1,2,3,4}}
給定正整數n,計算出n個元素的集合{1,2,, n }可以劃分爲多少個不同的非空子集。  

代碼實現:

import java.util.Scanner;



/**
 * @author Administrator 集合劃分
 * B(0) = 1,
 * B(n+1) = Sum(0,n) C(n,k)B(k). n = 1,2,...
 * 其中,Sum(0,n)表示對k從0到n求和,C(n,k) = n!/[k!(n-k)!] 
 */
public class SetManage {


/**
* @param n
* @param m
* @return
*/
int c(int n, int m) {
if (m > n / 2) {
m = n - m;
}
int a = 1, b = 1;
for (int i = n; i > n - m; i--) {
a *= i;
}
for (int i = 2; i <= m; i++) {
b *= i;
}
return a / b;
}


/**
* 貝爾數
* @param n
* @return
*/
int bell(int n) {
int t = 0;
if (n == 0) {
return 1;
} else {
for (int i = 0; i <= n - 1; i++)
t += c(n - 1, i) * bell(i);
}
return t;
}


/**
* @param args
*/
public static void main(String[] args) {
int n;
SetManage sm = new SetManage();
Scanner sc = new Scanner(System.in);
System.out.println("請輸入集合的上限:");
n = sc.nextInt();
System.out.println(sm.bell(n));


}


}
發佈了16 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章