这题怎么写啊

3. 组合

题目ID:9385必做题100分

最新提交:

Dangerous Syscall

0 分

历史最高:

Dangerous Syscall

0 分

时间限制: 1000ms

空间限制: 524288kB

题目描述

时间限制:1s 空间限制:512M

题目描述:

排列与组合是常用的数学方法,其中组合就是从 nn 个元素中抽出 rr 个元素(不分顺序且r≤n)。

在这里,我们可以简单地将 nn 个元素理解为自然数 1, 2, …, n1,2,…,n,从中任取 rr 个数。

现要求你输出所有组合。

例如 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

输入格式:

一行两个自然数 n, r\ (1 < r < n ≤ 20)n,r (1<r<n≤ 20)

输出格式:

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

样例输入:

5 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

简单的全排列
只要在你上一题( 排列 题目ID:9390)的基础上加上一个判断
核心代码

void dfs(int k) {
	if (k == r + 1) {
        for (int i = 1; i <= r; i++) {
			cout << ans[i] << ' ';
		}
		cout << '\n';
		return ;
	}
	for (int i = 1; i <= n; i++) {
		if (vis[i] == 0 && i >= ans[k - 1]) {
			vis[i] = 1;
			ans[k] = i;
			dfs(k+1);
			vis[i] = 0;
		}
	} 
}

@俞天行 你ans数组不撤回吗?

1 个赞

不需要啊

AC了