求m个总数中n个数的有序组合
本程序的思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标代表的数被选中,为0则没选中。
-
首先初始化,将数组前n个元素置1,表示第一个组合为前n个数。
-
然后从左到右扫描数组元素值的“10”组合,找到第一个“10”组合后将其变为“01”组合,同时将其左边的所有“1”全部移动到数组的最左端。
-
当第一个“1”移动到数组的m-n的位置,即n个“1”全部移动到最右端时,就得到了最后一个组合
例如求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
程序实例(结果为数组的排列方式):
#include <iostream>
using namespace std;
int main(){
bool flag = true;
long i, j, m, n, temp;
cout<< "请输入m和n:" <<endl;
cin>> m >> n;
long *num = new long[m];
for(i= 0; i < m; i++){
if(i< n)
num[i]= 1;
else
num[i]= 0;
}
while(flag){
temp= 0;
flag= false;
for(i= 0; i < m; i++)
cout<< num[i] << " ";
cout<< endl;
for(i= m - n; i < m; i++){
if(num[i]==0){
flag= true;
break;
}
}
for(i= 0; i < m - 1; i++){
if(num[i]== 1 && num[i + 1] == 0){
num[i]= 0;
num[i+ 1] = 1;
break;
}
if(num[i]== 1)
temp++;
}
for(j= 0; j < i; j++){
if(j< temp)
num[j]= 1;
else
num[j]= 0;
}
}
return0;
}