子集生成演算法

2022-06-21 15:12:08 字數 764 閱讀 1187

給定乙個集合(沒有重複元素),輸出所有子集。

首先考慮1~n的所有子集:

為了不出現和的情況,採用定序的方法。想象一棵解答樹,子節點的元素一定比父節點大。因為定序,解答樹葉子結點的深度不同。

解答樹上的每乙個結點有個值,從根節點到葉子結點路徑上的結點值為乙個集合,每加乙個結點就輸出一次。

**如下(輸入n):

#includeusing

namespace

std;

void f(int a, int cur, int

n) cout

<

for(int i = a[cur - 1] + 1; i <= n; i ++)

}int

main()

對於任意集合s,把上面的1~n當作鍵值(下標)就可以了(輸入n和s):

#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 ...