一个组合算法及实现

来源:互联网 发布:网络通信面试 编辑:程序博客网 时间:2024/05/21 19:28

算法来源与互联网,该算法不是采用递归,效率比较高,在我们的一个项目中有实现,拿出来和大家共享

组合算法  
  本程序的思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标  
  代表的数被选中,为0则没选中。    
  首先初始化,将数组前n个元素置1,表示第一个组合为前n个数。    
  然后从左到右扫描数组元素值的"10"组合,找到第一个"10"组合后将其变为  
  "01"组合,同时将其左边的所有"1"全部移动到数组的最左端。    
  当第一个"1"移动到数组的m-n的位置,即n个"1"全部移动到最右端时,就得  
  到了最后一个组合。

int comb(int m, int n)

{

    if (m<=n||n==0)

        return 0;

    char *flag = new char[m];

    int nRet = 1;

    memset(flag, 0x0, m);
    memset(flag, 0x1, n);

    //一种组合
    while(true)
    {
        k = 0;
        for (i = 0; i < size-1; i++)
        {
            if (flag[i] == '/1')//找到"10"
            {
               if (flag[i+1] == '/0')
               {
                   flag[i] = '/0';
                   flag[i+1] = '/1';
                   if (i>k && k>0)
                   {
                       memset(flag, 0x0, i);
                       memset(flag, 0x1, k);
                  }
                  break;
               }
               else
               {
                   k++;
               }
            }
        }
        if (i>=size-1) break;

        //一种组合

        nRet ++;
    }

    delete[] flag;

    return nRet;

}

运行结果事例

例如求5中选3的组合:    
  1   1   1   0   0   //1,2,3    
  1   1   0   1   0   //1,2,4    
  1   0   1   1   0   //1,3,4    
  0   1   1   1   0   //2,3,4    
  1   1   0   0   1   //1,2,5    
  1   0   1   0   1   //1,3,5    
  0   1   1   0   1   //2,3,5    
  1   0   0   1   1   //1,4,5    
  0   1   0   1   1   //2,4,5    
  0   0   1   1   1   //3,4,5