求集合的所有子集 續

2021-06-05 11:20:20 字數 1234 閱讀 3582

首先得利用輔助陣列index來記錄所有選中元素的下標,對於輔助陣列index需滿足以下兩個條件:

(1)index[i + 1] > index[i],即後乙個元素的下標必須大於前乙個元素的下標

(2)index[i] - i <= m - n (從m個元素中選取n個元素的子集,i表示子集中的第i+1個元素)

假如現有一集合set,求集合set中選取3個元素的所有子集。大致流程如下:

(1)選取第乙個元素,此時i = 0, index[i] = 0,滿足以上兩個條件,擴大規模,i = 1,index[1] = index[0] + 1 = 1。按此方法繼續擴大規模,得到第一組解:index[0] = 0, index[1] = 1, index[2] = 2, i = 2

index[0] = 0, index[1] = 1, index[2] = 3, i = 3

index[0] = 0, index[1] = 1, index[2] = 4, i = 4

(3)當index[2] = 5時,不再滿足第二個條件,因此需要回溯到index[1],將index[1]調整為2,繼續按以上步驟繼續計算,直到從index[0]再回溯時,表明已經求出所有子集。

具體**實現如下:

#include using namespace std;

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

cout << set[index[i] + k];

flag = true;

}cout << "}" << endl;

return;

}//從集合set[k:m]中選取n個元素的集合

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

index[i] = 0;

while (true)

i++; //繼續向前試探

index[i] = index[i - 1] + 1;

} else //回溯

index[--i]++;

} }

return 0;

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

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

return 0;

}int main(int argc, char *argv)

求集合的所有子集

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

集合的所有子集

假設集合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...