現有乙個包含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...