2013年5月14日 星期二

N 選 k 的組合列出

// 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;
}


沒有留言:

張貼留言