給定乙個集合(沒有重複元素),輸出所有子集。
首先考慮1~n的所有子集:
為了不出現和的情況,採用定序的方法。想象一棵解答樹,子節點的元素一定比父節點大。因為定序,解答樹葉子結點的深度不同。
解答樹上的每乙個結點有個值,從根節點到葉子結點路徑上的結點值為乙個集合,每加乙個結點就輸出一次。
**如下(輸入n):
#includeusing對於任意集合s,把上面的1~n當作鍵值(下標)就可以了(輸入n和s):namespace
std;
void f(int a, int cur, int
n) cout
<
for(int i = a[cur - 1] + 1; i <= n; i ++)
}int
main()
#includeusing關鍵點:定序、乙個結點代表乙個子集namespace
std;
void f(int s, int a, int cur, int
n) cout
<
for(int i = a[cur - 1] + 1; i <= n; i ++)
}int
main()
a[0] = 0
; f(s, a,
1, n);
return0;
}
不好理解的話建議先搞明白全排列,部落格裡排列講的也詳細些
子集生成演算法
劉汝佳書上的內容 下文提到的集合 其元素預設為0 n 1 n 個 意思就是一次選乙個 放到 裡 include include include include include include include include include include include include includ...
子集生成演算法
子集生成演算法屬於暴力法中一類非常重要的演算法.給定乙個集合,請寫乙個演算法,得到其所有的子集.這裡假定該集合不存在重複的元素.舉個栗子,給定集合 1,2,3 你返回這樣一堆子集 1 2 3 1,2 1,3 2,3 1,2,3 根據離散數學的知識,我們可以知道,乙個長度為n的集合的子集有2n個,集合...
子集生成演算法
1.增量構造法 基本思路 一次選出乙個元素放到集合中。使用前序遍歷的方法,因為a中元素個數不確定,每次遞迴呼叫都要輸出當前集合。演算法流程 另外,為了避免出現類似於按照和輸出兩次,可以使用定序的技巧,即規定集合a中所有元素的編號從小到大排列,對應於程式中的int s cur?a cur 1 1 0 ...