組合:乙個集的元素的組合是乙個子集。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...