求集合的所有子集

2021-06-04 20:01:04 字數 1503 閱讀 1455

現有乙個包含n個元素的集合s,求集合s的所有子集?

例如:集合s包含三個元素,則它的所有子集為:(空集), , , , , , 和。

這裡先用位操作的思路來求解,具體方法:用2進製bit位來標記集合中的某個元素是否被選中,1代表選中,0代表未選中。例如集合的所有子集可如下表示:

{}(空集)               0 0 0

0 0 1

0 1 0

1 0 0

0 1 1

1 0 1

1 1 0

1 1 1

從上面的分析中也可以看出乙個包含n個元素的集合s有2^n個子集,非常容易想到的方法就是遍歷0~2^n-1的所有整數,並轉化為二進位制,按以上思路輸出所有子集。但這裡我們參照《求比正整數n大的最小正整數m,且m與n的二進位制表示中有相同數目的1》的方法來求解集合s的所有子集。具體實現如下:

#include using namespace std;

const int ok = 0;

const int error = 1;

int getnextn(int n)

templatevoid output(t set, int k, int n)

cout << set[k + index];

flag = true;

}n /= 2;

index++;

}cout << "}" << endl;

}//生成集合set[k:m]的所有子集

templateint subset(t set, int k, int m)

output(set, k, 0); //空集作特殊處理

int num = m - k + 1;

for (int i = 1; i <= num; i++) //從集合set[k:m]中選擇i個元素

}return ok;

}int main(int argc, char *argv)

這裡再提供一種遞迴的思路來解決問題,會借助乙個全域性變數來記錄所有選中的元素,具體**如下:

#include using namespace std;

int g_used[10] = ;

templatevoid output(t set)

cout << set[i];

flag = true;}}

cout << "}" << endl;

}//生成集合set[k:m]的所有子集

templatevoid subset(t set, int k, int m)

g_used[k] = 0; //未選中

subset(set, k + 1, m);

g_used[k] = 1; //選中

subset(set, k + 1, m);

}int main(int argc, char *argv)

求集合的所有子集 續

首先得利用輔助陣列index來記錄所有選中元素的下標,對於輔助陣列index需滿足以下兩個條件 1 index i 1 index i 即後乙個元素的下標必須大於前乙個元素的下標 2 index i i m n 從m個元素中選取n個元素的子集,i表示子集中的第i 1個元素 假如現有一集合set,求集...

集合的所有子集

假設集合a 它的所有集合是 表示空集 可以這樣理解這張圖,從集合a的每個元素自身分析,它只有兩種狀態,或是某個子集的元素,或是不屬於任何子集,所以求子集的過程就可以看成對每個元素進行 取捨 的過程。n個元素有2的n次方個組合 每一層左邊節點表示加入該層元素,右邊表示不加入。第二層表示對第1個元素的處...

求集合元素的所有非空子集

現有乙個包含n個元素的集合s,求集合s的所有子集?例如 集合s包含三個元素,則它的所有子集為 空集 和。這 裡先用位操作的思路來求解,具體方法 用2進製bit位來標記集合中的某個元素是否被選中,1代表選中,0代表未選中。例如集合的所有子集可如下表示 0 0 1 0 1 0 1 0 0 0 1 1 1...