組合演算法實現

2021-06-18 07:42:11 字數 2875 閱讀 7130

組合:乙個集的元素的組合是乙個子集。s的乙個k-組合是s的乙個有k個元素的子集。組合具有無序性。若兩個子集的元素完全相同僅順序不同,看作同乙個組合。

組合符號:

這裡介紹4中常見的組合形式:

1.完全組合。

2.不重複完全組合。

3.選擇組合。

4.有重複選擇組合。

1.完全組合

從n元素集s中取出所有的k個元素子集(0 <= k <= n)。規模數為nc0 + nc1 + ... + ncn = 2^n。

1)位運算_實現

//完全組合

typedef char elemtype;

void full_combination_bit(const elemtype *a, int n)

elemtypeex;

template< class t > void safedelete( t*& pval )

template< class t > void safedeletearray( t*& pval )

//壓縮陣列elemtype a[n]為elemtypeex a_compress[m]

void compress(const elemtype *a, int n, elemtypeex *a_compress, int &m)

} if (j == m)

}}//統計不同元素的個數

int count_unrepeat(const elemtype *a, int n)

if (j == i) //遍歷完了還沒有找到 +1

}return count;

}//不重複完全組合

//l:表示上次已經選擇出l個元素

//p:表示上次選擇的元素為a[p-1],本次需要選擇的元素為a[p]

void _unrepeat_combination_recursion(elemtypeex *a, int n, elemtype *choosed, int l, int p)

} return;

}void unrepeat_combination_recursion(const elemtype *a, int n)

完全組合與不重複完全組合比較

完全組合輸入:a a c

輸出:

不重複完全組合輸入:a a c

輸出:

可以看出:後者將重複的組合 a 、a c 過濾了。

3.選擇組合

從n元素集s中取出k元素子集。規模數為nck。

1)位運算_實現

**中呼叫的函式hamming_weight,功能為:統計二進位制數字中1的個數

//選擇組合

typedef char elemtype;

void select_combination_bit(const elemtype *a, int n, int m)

{ //unsigned int mask = (1 << n) - 1;

unsigned int mask = 0;

for (int i = 0; i < n; ++i)

{ mask |= unsigned int(1<0; i = (i - 1)&mask)

{ if (hamming_weight(i, 3) == m)

{ cout< j)&1))

{cout輸入:a b c d k = 2

輸出:

2)遞迴_實現

//選擇組合 c(n,m)

//l:表示上次已經選擇出l個元素

//p:表示上次選擇的元素為a[p-1],本次需要選擇的元素為a[p]

typedef char elemtype;

void _select_combination_recursion(const elemtype *a, int n, int m, elemtype *choosed, int l, int p)

{ if (l == m)

{ static int count = 1;

cout<

輸出:

4.有重複選擇組合

從n 個不同元素中每次取乙個,放回後再取下乙個,如此連續取k次所得的k個元素子集。規模數為(n+k-1)ck。

1)遞迴_實現

//重複選擇組合c(n+m-1,m)

//l:表示上次已經選擇出l個元素

//p:表示上次選擇的元素為a[p-1],本次需要選擇的元素為a[p]

typedef char elemtype;

void _repeat_combination_recursion(const elemtype *a, int n, int m, elemtype *choosed, int l, int p)

{ if (l == m)

{ static int count = 1;

cout<

輸出:

驗證規模數:(n+k-1)ck = (3+3-1)c3 = 5c3 = 10。

組合演算法就結束了,後面有增加再補充。

組合演算法 遞迴實現

假設在n個數中選取m 0 從n個數中選取編號最大的數,然後在剩下的n 1個數裡面選取m 1個數,直到從n m 1 個數中選取1個數。從n個數中選取編號更小的乙個數,繼續執行第一步,直到當前可選編號最大的值為m。下面是遞迴方法的實現 求從陣列a 1.n 中任選m個元素的所有組合。a 1.n 表示候選集...

排列組合演算法實現

全排列表示把集合中元素的所有按照一定的順序排列起來,使用p n,n n 表示n個元素全排列的個數。例如 的全排列為 123 132 213 231 312 321 共6個,即3!321 6。這個是怎麼算出來的呢?首先取乙個元素,例如取出了1,那麼就還剩下。然後再從剩下的集合中取出乙個元素,例如取出2...

遞迴組合演算法

遞迴組合演算法 演算法思想 對於乙個長度為m的序列,要求n個數的組合。1.從索引最小的元素遍歷到第n m個元素,將遍歷到的元素定為組合中的第乙個元素 2.判斷組合中n個元素是否已滿,如果滿了,列印該組合,如果不滿重,則擷取1中選擇的元素之後的序列,復步驟一。include include using...