題目說明:假設有個集合擁有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 usingnamespace
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...