經典演算法 排列組合 N元素集合的M元素子集

2022-03-30 22:36:10 字數 1177 閱讀 6149

題目說明:假設有個集合擁有n個元素,任意的從集合中取出m個元素,則這m個元素所形成的可能子集有那些?

題目解析:假設有5個元素的集合,取出3個元素的可能子集如下:

、、、、、、、、、

這些子集已經使用字典順序排列,如此才可以觀察出一些規則:

如果最右乙個元素小於m,則如上面一樣的不斷加1

如果右邊一位已至最大值,則加1的位置往左移

每次加1的位置往左移後,必須重新調整右邊的元素為遞減順序

所以關鍵點就在於哪乙個位置必須進行加1的動作,到底是最右乙個位置要加1?還是其它的位置?

在實際撰寫程式時,可以使用乙個變數positon來記錄加1的位置,position的初值設定為n-1,因為我們要使用佇列,而最右邊的索引值為最大的n-1,在position位置的值若小於m就不斷加1,如果等於m了,position就減1,也就是往左移乙個位置;由於位置左移後,右邊的元素會經過調整,所以我們必須檢查最右邊的元素是否小於m,如果是,則position調整回n-1,如果不是,則positon維持不變。

程式**:

#include using

namespace

std;

void showresult(int data, int

m) cout

<}int generatemfromn(int n, int

m)

int* state = new

int[m];

for (int i=0; i)

ncount++;

showresult(state, m);

int npos = m-1

;

while (state[0] < n-m+1

)

else

state[npos]++;

for (int i = npos+1; i < m; i++)

showresult(state, m);

ncount++;

}delete

state;

return

ncount;

}test(algo, tgeneratemfromn)

C 經典演算法題 排列組合

將一組數字 字母或符號進行排列,以得到不同的組合順序,例如1 2 3這三個數的排列組合有 1 23 1 32 2 13 2 31 3 12 3 21。可以使用遞迴將問題切割為較小的單元進行排列組合,例如1 2 3 4的排列可以分為 1 2 34 2 13 4 3 1 24 4 12 3 進行排列,這...

C 排列組合 N個數中取M個數

感謝一位好朋友和我分享了這樣的乙份 因為自己當時考慮的遞迴演算法相當糾結,怎樣遞迴都不大對,然後我的好朋友和我分享了一段這樣的 我現在分享給大家。題目 在n個數中取m個數,用的方法使用的是開闢乙個長度為100的int型陣列,0 1 2 99 100 比如說測試資料為 4 2 也就是從1 4中取2個數...

從n個數中挑m個的排列組合演算法

created on 2020 7 16 從n個數中挑m個的排列組合演算法 var result 最終的結果 var array 1,2,3,4 被挑選的 param array 被選則的陣列 param max 要選出m個進行排列組合 param tmp 快取的陣列 function getone...