找出n个数的r个数的组合,如下形式:
输入:n,r分别为 5, 3
输出: 5 4 3
5 4 2
5 4 1
5 3 2
5 3 1
5 2 1
4 3 2
4 3 1
4 2 1
3 2 1
分析:我的思路如下,用增量构造法,生成一个子集,用if语句判断是否符合r个数,若为真,则输出结果。按题目要求,子集要倒序输出,所以要将模型的for循环改为由n-1到0,输出时再统一加上1。
#include<cstdio>
#include<cstdlib>
using namespace std;
void sub(int n,int *a,int cur,int r)
{
if(cur==r){
for(int i=0;i<cur;i++)printf("%d ",a[i]+1);
putchar('\n');
return;
}
int s=cur?a[cur-1]-1:n-1;
for(int i=s;i>=0;i--){
a[cur]=i;
sub(n,a,cur+1,r);
}
}
int main()
{
int n,r,a[101];
scanf("%d%d",&n,&r);
sub(n,a,0,r);
return 0;
}
本文介绍了一种使用增量构造法生成指定范围内所有可能的组合数的方法,并通过C++代码实现了一个具体的例子,展示如何生成从n个数中选择r个数的所有组合。
4028

被折叠的 条评论
为什么被折叠?



