「枚举」组合的输出

yizhihongxing

本题为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日

相关文章

  • python实现高斯判别分析算法的例子

    Python实现高斯判别分析算法的例子 高斯判别分析(Gaussian Discriminant Analysis,GDA)是一种经典的分类算法,它假设每个类别的数据都服从高斯分布,并通过最大化似然函数来估计模型参数。在本攻略中,我们将介绍如何使用Python实现高斯判别分析算法,并提供两个示例来说明如何使用高斯判别分析算法进行分类。 步骤1:了解高斯判别分…

    python 2023年5月14日
    00
  • Huffman实现

    Huffman编码树 秒懂:【算法】Huffman编码_哔哩哔哩_bilibili 约定:字符x的编码长度 就是其对应叶节点的深度; 在一个字符集中,每个字符出现的次数有多有少,那么若都采用固定长度编码的话,那么编码长度会非常大,并且搜索时间复杂度都非常高;若采用非固定编码,出现次数多的字符编码长度小一些,并且放在树深度小的地方,提高搜索时间效率;这样带权平…

    算法与数据结构 2023年4月17日
    00
  • Java数据结构之顺序表的实现

    下面是“Java数据结构之顺序表的实现”的完整攻略: 标题:Java数据结构之顺序表的实现 一、什么是顺序表 顺序表是一种线性表结构,其数据元素在物理位置上是连续的,通过下标访问,具有随机访问的优点。 二、顺序表的实现 使用Java语言实现顺序表,需要定义以下三个类: 1. SeqList类 构造顺序表的数据结构,并定义了一些基本操作,如插入、删除、修改等。…

    数据结构 2023年5月17日
    00
  • Java面试题冲刺第十三天–数据库(3)

    当我们准备面试数据库相关的职位时,需要掌握SQL语言和常见的数据库管理系统。下面是针对Java面试中可能出现的常见数据库面试题的一些攻略。 1. 数据库连接的常见方式 在Java中,要与数据库连接有两种方式:JDBC和ORM框架。 (1) JDBC JDBC是Java连接数据库的标准方式,使用JDBC可以通过Java程序来连接不同的数据库。连接数据库的步骤包…

    数据结构 2023年5月17日
    00
  • 决策树剪枝算法的python实现方法详解

    下面是详细讲解“决策树剪枝算法的Python实现方法”的完整攻略,包括算法原理、Python实现和两个示例说明。 算法原理 决策树剪枝算法是一种用于减少决策树复杂度的技术,通过去除一些不必要的分支和叶子节点,从而提高决策树的泛化能力和预测性能。其基本思想是决策树的训练过程中,先生成一棵完整的决策树,然后通过对决策树进行剪枝,去除一些不必要的分支和叶子节点,从…

    python 2023年5月14日
    00
  • Redis数据结构之链表详解

    Redis数据结构之链表详解 Redis中,链表是一个非常重要的底层数据结构,被用于实现众多高级数据结构(例如列表、队列等)的底层实现,同时也可以被用户直接使用。这篇文章将详细讲解Redis的链表实现、过程和应用。 链表结构 Redis的链表由多个节点组成,每个节点包含以下三个部分: 前置节点地址(prev) 后置节点地址(next) 节点的值(value)…

    数据结构 2023年5月17日
    00
  • JavaScript数据结构与算法

    JavaScript数据结构与算法完整攻略 什么是数据结构与算法 数据结构和算法是计算机科学的重要组成部分,常用于解决数据处理问题的方法与技术。数据结构是指存储和组织数据的方式,而算法则是解决数据处理问题的途径和方法。 数据结构分类 数据结构可分为以下几类: 数组 —— 存储有序元素集合的线性结构; 栈 —— 一种后进先出的数据结构; 队列 —— 一种先进先…

    数据结构 2023年5月17日
    00
  • Java数据结构二叉树难点解析

    Java数据结构二叉树难点解析 什么是二叉树 二叉树是一种非常常见的数据结构,它具有以下特点: 每个节点都最多有两个子节点。 左子节点的值小于等于父节点的值,右子节点的值大于等于父节点的值。 二叉树可以用递归的方式实现,如下所示: class TreeNode { int val; TreeNode left; TreeNode right; TreeNod…

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