// N 取 k 的組合, 回傳 組合數
int Combination( int N, int k)
{
int i, j, no=1; // 初始值已有第一組
int comb[10], maxV[10];
// 不要超過N選 10, array 才開 10 個, 這邊儘量不用 STL/Alloc
for(i=0; i <k; i++)
{
comb[i] = i; // initial value( 0,1,2,...,k-1) 第一組
maxV[i] = N - k + i; // 每個位置的最大值
}
while(1)
{
// ====== 如果要顯示的話在這裡 ========
//for(i=0; i <k; i++)
// printf("%d", comb[i]);
//printf(",");
j = k-1; // 每次都從最後一個數字做起
comb[j]++; // 最後一個數字 +1
while (j>0 && comb[j] > maxV[j]) // 如果該位置超過最大值, 搞前一個數字
{
j--;
comb[j]++; // 但繼續 check
}
// 第一個位置超過最大值, 結束
if (j==0 && comb[0] > maxV[0])
break;
for(i=j+1; i<k; i++)
comb[i] = comb[i-1]+1; // 下個數字, 是這個數字+1, 一直搞到最後一個數字
no++; // Counter, 組數
}
return no;
}
沒有留言:
張貼留言