计算机学院有n(0<n<10)个学霸,现选优秀毕业生m(0<m<=n)个,由于无法选出最优秀的学生,现只能随机抽取,现在,将这n个学霸按1,2,3...n编号,请给出将获得优秀毕业生的所有组合
输入:
输入n m
输出:
输出所有优秀毕业生可能的组合,且每个组合的数值需从大到小降序排列,组合与组合之间需按逆字典序排列
#include <iostream>
using namespace std;
int main()
{
int n, m;
cin >> n >> m;
int i = n;
int* arr = new int[m];
int index = m - 1;
int tmp = i;
for (int k = 0; k < m; ++k){
arr[k] = tmp--;
}
for (int j = index; j >= 0; ){
int min = m - j;
for (int h = j+1; h < m; ++h){
arr[h] = arr[h - 1]-1;
}
while (arr[j] >= min && arr[m-1] >= 1){
for (int t = 0; t < m; ++t){
cout << arr[t] << " ";
}
cout << endl;
--arr[m-1];
}
if (arr[j] < min){
--j;
--arr[j];
}
else{
if (arr[j] == min)
--j;
for (int g = m - 1; g >= 0; --g){
if (arr[g]>m - g){
--arr[g];
j = g;
break;
}
}
}
}
delete[] arr;
system("pause");
return 0;
}《完》
本文出自 “零蛋蛋” 博客,谢绝转载!
原文:http://lingdandan.blog.51cto.com/10697032/1877851