初级天翼
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;
}
中级天翼
一、循环从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
资深天翼
https://wenda.codingtang.com/questions/7826/
https://wenda.codingtang.com/questions/7444/
这里有答案哦~
主要大块:循环嵌套,if-else嵌套,循环判断,循环输出
沈峻宇在2020-04-21 17:59:40追加了内容
用递归的弟弟:递增写【滑稽】
沈峻宇在2020-04-21 18:00:33追加了内容
或是枚举+数组+输出+采纳(可忽略此步骤,不强求!)=AC
资深光能
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追加了内容
因为递增输出