C++从1~m数字中任取k个元素,求所有组合算法

# define      MAXN      100
int a[MAXN]; //定位数组,用于指示选取元素集合数组的位置,选取元素集合数组0 起始
void comb(int m,int r)
{   
      int cur;//指示定位数组中哪个成员正在移进
      unsigned int count=0;
      //初始化定位数组,0 起始的位置 ,开始的选择必是位置 0,1,2
      for(int i=0;i<r;i++)
          a[i]=i;
      cur=r-1;//当前是最后一个成员要移进
       do{
          if (a[cur]-cur<=m-r ){ 
              count++;
              
              for (int j=0;j<r;j++)
                  cout<<(a[j] + 1) << " ";
              cout<<endl;
              
              a[cur]++;

              continue;
          }
          else{
              if (cur==0){
                  cout<<count<<endl;
                  break;
              }
              a[--cur]++;
              for(int i=1;i<r-cur;i++){
                  a[cur+i]=a[cur]+i;
              }
              if(a[cur]-cur<m-r)
                  cur=r-1;                
          }
      }while (1);
}


调用方法如下:

comb(50, 3);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值