「枚举」组合的输出

本题为3月23日23上半学期集训每日一题中B题的题解

题面

(写题解的时候学校oj已不可查看此题,下面的题面来自洛谷第1157题)

题目描述

排列与组合是常用的数学方法,其中组合就是从 \(n\) 个元素中抽出 \(r\) 个元素(不分顺序且 \(r \le n\)),我们可以简单地将 \(n\) 个元素理解为自然数 \(1,2,\dots,n\),从中任取 \(r\) 个数。

现要求你输出所有组合。

例如 \(n=5,r=3\),所有组合为:

\(123,124,125,134,135,145,234,235,245,345\)

输入

一行两个自然数 \(n,r(1<n<21,0 \le r \le n)\)

输出

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

注意哦!输出时,每个数字需要 \(3\) 个场宽。以 C++ 为例,你可以使用下列代码:

cout << setw(3) << x;

输出占 \(3\) 个场宽的数 \(x\)。注意你需要头文件 iomanip

样例输入

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

思路分析

非常经典的暴力枚举问题,直接对每一位枚举就行了.学校oj的题目上明确要求用递归的方法进行枚举,所以这里给出的参考代码是递归形式的.其实还可以使用迭代形式的二进制枚举,以及使用C++内置的next_permutation函数.

参考代码

时间复杂度: \(O(\tbinom{N}{R})\)

空间复杂度: \(O(R)\) (计入递归消耗空间)

#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3, "Ofast", "inline")
#include <bits/stdc++.h>

using namespace std;

using i64 = long long;

vector<int> res; // 存放答案

// 爆搜所有组合
void dfs(int n, int i, int r) {
    // 基线条件,当前答案已完成填写,输出
    if (r == 0) {
        for (const auto &i : res) {
            cout << setw(3) << i;
        }
        cout << "\n";
        return;
    }

    // 枚举当前位置的所有可能
    for (; i <= n; i++) {
        res.push_back(i);
        dfs(n, i + 1, r - 1); // 继续枚举下一位置
        res.pop_back(); // 因为是递归,运行到这行时后续位的枚举已经完成,为了当前位枚举下一个可能,需要消除掉本次枚举,所以把最后一个数踢掉(其他数在相应的递归中会被踢掉)
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);W

    int n, r;
    cin >> n >> r;

    res.reserve(r);
    dfs(n, 1, r);

    return 0;
}

"正是我们每天反复做的事情,最终造就了我们,优秀不是一种行为,而是一种习惯" ---亚里士多德

原文链接:https://www.cnblogs.com/geministar/p/zstu23_3_22_A.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:「枚举」组合的输出 - Python技术站

(0)
上一篇 2023年4月18日
下一篇 2023年4月18日

相关文章

  • C++数据结构之文件压缩(哈夫曼树)实例详解

    我来为您详细讲解一下“C++数据结构之文件压缩(哈夫曼树)实例详解”这篇文章的完整攻略: 文章基本信息 标题:C++数据结构之文件压缩(哈夫曼树)实例详解 作者:Coder_XWG 发布时间:2019年12月24日 文章概述 该篇文章主要讲解了哈夫曼树在文件压缩方面的应用。通过实例讲解了如何使用哈夫曼编码将文件进行压缩,以及如何解压缩被压缩的文件,并对文章中…

    数据结构 2023年5月17日
    00
  • Go语言数据结构之单链表的实例详解

    Go语言数据结构之单链表的实例详解 简介 单链表是一个常见的数据结构,它由一系列节点组成,每个节点包含一个值和指向下一个节点的引用。单链表的插入和删除操作比较容易,但是访问操作的效率相对较低。 在Go语言中,可以使用结构体配合指针来实现单链表。 实现思路 为了实现单链表,需要先定义一个节点结构体Node,包含一个value值和一个next指针。通过next指…

    数据结构 2023年5月17日
    00
  • 跟老齐学Python之啰嗦的除法

    在Python中,除法运算符/的结果可能会出现小数,这是因为Python默认使用浮点数进行除法运算。但是在某些情况下,我们需要使用整数进行除法运算,这时候就需要使用Python中的整除运算符//。 下面是“跟老齐学Python之啰嗦的除法”的完整攻略: 1. Python中的除法运算符 在Python中,除法运算符/的结果可能会出现小数,例如: >&g…

    python 2023年5月14日
    00
  • 使用Python进行数独求解详解(二)

    使用Python进行数独求解详解(二) 本文将继续介绍如何使用Python进行数独求解。我们将介绍如何使用回溯算法和剪枝技巧来提高求解效率。同时,我们提供两个示例,分别演如何使用Python求解简单和困难的数独谜题。 回溯算法和剪枝技巧 回溯算法是一种通过尝试所有可能的解来求解问题的算法。在数独求解中,回溯算法可以通过递归地尝试每个空格的可能来求解数独谜题。…

    python 2023年5月14日
    00
  • C语言编程数据结构线性表之顺序表和链表原理分析

    C语言编程数据结构线性表之顺序表和链表原理分析 线性表的定义 线性表是由n(n>=0)个数据元素a1、a2、…、an组成的有限序列,通常用(a1, a2, …, an)表示,其中a1是线性表的第一个元素,an是线性表的最后一个元素。线性表中的元素个数n称为线性表的长度,当n=0时,线性表为空表。 线性表的分类 根据存储结构,线性表可以分为顺序表…

    数据结构 2023年5月17日
    00
  • python遗传算法之geatpy的深入理解

    以下是关于“Python遗传算法之geatpy的深入理解”的完整攻略: 简介 遗传算法是一种常见的优化算法,它可以通过模拟生物进化过程来寻找最优解。Python中有多种库可以实现遗传算法,例如geatpy。本教程将介绍如何使用geatpy库实现遗传算法,并提供两个示例。 geatpy库 geatpy是一个Python库,它提供了多种遗传算法的实现。geatp…

    python 2023年5月14日
    00
  • ES6新特性五:Set与Map的数据结构实例分析

    ES6新特性五:Set与Map的数据结构实例分析 ES6引入了Set和Map两种新的数据结构,可以帮助我们更方便地操作一些复杂的数据结构。本文将会分别介绍Set和Map的基本用法,并且提供一些实例说明,帮助大家更好地理解。 Set数据结构 基本用法 Set对象是一种无序的、无重复元素、容器类的数据结构。其基本用法如下: const set = new Set…

    数据结构 2023年5月17日
    00
  • Go语言数据结构之选择排序示例详解

    Go语言数据结构之选择排序示例详解 什么是选择排序? 选择排序是一种简单的排序算法,它的基本思想是在待排序的数列中选择一个最小(或最大)的元素放到最前面,再在剩下的数列中选择一个最小(或最大)的元素放到已排序序列的末尾,以此类推,直到所有的元素都排序完毕。 其排序的时间复杂度为O(N²),在数据量较小的情况下使用起来非常方便。 选择排序的实现 下面我们来看一…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部