C++的一问题
编一个函数,输入x,y,就可以把1,2,3,4...x的所有由y个数为一组的组合打印出来,如输入3,2 就打印1,2 1,3 2,3;
补充:我主要想用递归是否可以解决此问题?
如果不可以,用别的方法也可以.
谢谢!
参考答案:递归应该也可以实现,参考下背包问题的递归程序
这是从个全排列算法修改过来的,效率并不高
n, m = 3 2
1 : 1 2
2 : 1 3
3 : 2 3
Press any key to continue
#include<iostream>
using namespace std;
int N = 1;
void print(int a[], int n) {
cout<<' '<<N++<<" : ";
for (int i = 0; i < n; i++)
cout<<a[i]<<' ';
cout<<endl;
}
void swap(int &a, int &b) {
int t = a;
a = b;
b = t;
}//交换
void reverse(int a[], int i, int j) {
while (i<j) {
swap(a[i++],a[j--]);
}
}//颠倒
f(int a[], int n) {
for (int i = 0; i < n-1; i++)
if(a[i] > a[i+1])
return 0;
return 1;
}
void main() {
int *a, i, j, n, m;
cout<<" n, m = ";
cin>>n>>m;
a = new int[n];
for (i = 0; i < n; i++)
a[i] = i + 1;
i = m - 1;
while (1) {
if(i+1 == m && f(a, m)) {
print(a, m);
}
for (i=n-2; i>=0; i--)
if (a[i] < a[i+1]) break;
if (i==-1) break;
for (j=n-1; j>i; j--)
if (a[j] > a[i]) break;
swap(a[i],a[j]);
reverse(a,i+1,n-1);
}
}