问题标题: 酷町堂:1012 组合的输出

0
0
已解决
王子健
王子健
初级天翼
初级天翼

1012   组合的输出    经验值:800

题目描述 Description

排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r<=n),我们可以简单地将n个元素理解为自然数1,2,…,n,从中任取r个数。
现要求你用递归的方法输出所有组合。
例如n=5,r=3,所有组合为:
1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5

输入描述 Input Description

一行两个自然数n、r(1<n<21,0<=r<=n)。

输出描述 Output Description

所有的组合,每一个组合占一行且其中的元素按由小到大的顺序排列,所有的组合也按字典顺序。

样例输入 Sample Input

5 3

样例输出 Sample Output

1 2 3 1 2 4 1 2 5 1 3 4 1 3 5 1 4 5 2 3 4 2 3 5 2 4 5 3 4 5

 

我的0分代码:

#include <iostream>
using namespace std;
int n, r;
int used[25];
int a[25];
void dfs(int t) {
	if (t == r+1) {
		for (int i=1; i<=r; i++) {
			cout << a[i] << ' ';
		}
		cout << endl;
		return ;
	}
	for (int i=1; i<=n; i++) {
		if(used[i] == 0) {
			a[t] = i;
			used[i] = 1;
			dfs(t+1);
			used[i] = 0;
		}
	}
}
int main() {
	cin >> n >> r;
	dfs(1); 
	return 0;
}

望大佬改正

王子健在2020-04-21 18:21:25追加了内容

你们说去掉used数组什么意思,这样也不对啊

#include <iostream>
using namespace std;
int n, r;
int a[25];
void dfs(int t) {
    if (t == r+1) {
        for (int i=1; i<=r; i++) {
            cout << a[i] << ' ';
        }
        cout << endl;
        return ;
    }
    for (int i=a[i-1] + 1; i<=n; i++) {
            a[t] = i;
            dfs(t+1);
    }
}
int main() {
    cin >> n >> r;
    dfs(1); 
    return 0;
}

 


0
已采纳
董子墨
董子墨
中级天翼
中级天翼

一、循环从a[t-1]+1开始

二、去掉used数组和if

董子墨在2020-04-21 18:38:22追加了内容

原因:

一、因为要递增,所以要从上一个数加一开始循环

二、因为数越来越大,所以不用担心重复

 

董子墨在2020-04-21 18:54:35追加了内容

是a[t-1]+1,而不是a[i-1]+1

0
0
张岳恒
张岳恒
资深光能
资深光能

if里是!used[i]吧

张岳恒在2020-04-20 14:35:02追加了内容

说错了,不需要if,used数组

张岳恒在2020-04-20 14:36:34追加了内容

还有是递增输出

张岳恒在2020-04-20 18:08:55追加了内容

去掉if,used数组,循环有a[t-1]+1开始

张岳恒在2020-04-21 18:33:32追加了内容

因为递增输出

0
赵逸凡
赵逸凡
初级启示者
初级启示者

直接暴力枚举啊,再加几个特判used数组,然后输出

我要回答