【洛谷 P1157】组合的输出 题解(深度优先搜索+枚举子集)

简介: 该问题要求编程输出从1到n中选择r个元素的所有组合,组合按字典序排列。输入包含两自然数n和r(1<n<21, 0≤r≤n)。输出每个组合时,每个数字占据3个字符宽度。提供的AC代码使用C++,通过递归搜索方法枚举子集。样例输入为5 3,输出显示所有3个元素的组合。

组合的输出

题目描述

排列与组合是常用的数学方法,其中组合就是从 $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

样例 #1

样例输入 #1

5 3

样例输出 #1

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

思路

通过搜索来枚举子集。

AC代码

#include <iostream>
#include <iomanip>
#define AUTHOR "HEX9CF"
using namespace std;

const int maxn = 100005;

int n, r;
int a[maxn];

void f(int x)
{
   
    if (x > r)
    {
   
        for (int i = 1; i <= r; i++)
        {
   
            cout << setw(3) << a[i];
        }
        cout << endl;
        return;
    }
    for (int i = a[x - 1] + 1; i <= n; i++)
    {
   
        a[x] = i;
        f(x + 1);
    }
}

int main()
{
   
    a[0] = 0;
    cin >> n >> r;
    f(1);
    return 0;
}
目录
相关文章
|
虚拟化 Docker 容器
【openstack】问题记录:实例创建失败?(未解决)
【openstack】问题记录:实例创建失败?(未解决)
1676 0
【openstack】问题记录:实例创建失败?(未解决)
|
4月前
|
数据采集 存储 JSON
淘宝数据爬虫方案
本项目使用 Selenium 模拟浏览器行为,实现淘宝商品信息爬取,包括商品标题、价格、到手价、店铺名、销量等,并支持保存为 CSV 或 JSON 文件。代码内置反爬策略应对机制,适合用于商品数据采集与分析。
|
12月前
|
大数据 Linux 数据库
openEuler操作系统介绍
openEuler是一款开源免费的操作系统,由openEuler社区运作,支持多种处理器,适用于数据库、大数据、云计算等场景。它源自华为EulerOS,现分为创新版和LTS版,分别每半年和每两年发布一次。本课程以openEuler 20.03 LTS版为例,介绍其安装流程和环境准备。
963 3
|
C++
【洛谷 P1739】表达式括号匹配 题解(栈)
该编程题目要求检查给定的包含字母、运算符和括号的表达式是否括号匹配。输入为一行表达式,以`@`结束。如果括号匹配,输出`YES`,否则输出`NO`。样例包括一个匹配和一个不匹配的表达式。解决方案是使用栈,遇到左括号入栈,遇到右括号时判断栈是否为空,栈空则输出`NO`,否则出栈。当读到`@`时,栈空则输出`YES`,否则输出`NO`。提供的AC代码使用C++实现,通过`stack`处理括号匹配。
296 0
【洛谷 P1002】[NOIP2002 普及组] 过河卒 题解(递归+记忆化搜索)
`NOIP2002`普及组的过河卒问题是一个棋盘路径计数挑战。卒从$(0,0)$出发到$(n,m)$,只能向下或向右移动,马在$(c1,c2)$固定,控制某些点。任务是计算不受马阻挡的路径数。输入是目标和马的位置,输出是路径总数。使用动态规划和记忆化搜索避免重复计算,样例输入$(6,6,3,3)$输出$6$。代码中定义了$f(x,y)$计算$(x,y)$处的路径数,利用边界条件和递推关系计算。
206 0
|
存储 网络性能优化 文件存储
OpenStack的块存储卷类型和QoS
【8月更文挑战第25天】
349 4
|
Java 容器
Swing程序设计(3)JDialog窗体
Swing程序设计(3)JDialog窗体
308 0
|
C++ 容器
【C++】string类的使用①(迭代器接口begin,end,rbegin和rend)
迭代器接口是获取容器元素指针的成员函数。`begin()`返回首元素的正向迭代器,`end()`返回末元素之后的位置。`rbegin()`和`rend()`提供反向迭代器,分别指向尾元素和首元素之前。C++11增加了const版本以供只读访问。示例代码展示了如何使用这些迭代器遍历字符串。
|
Java 测试技术 Maven
Spring整合JUnit实现单元测试
本文介绍了如何在Java开发中使用Spring与JUnit进行单元测试。首先,设置JUnit和Spring环境,创建待测试的业务逻辑类,如MyService。接着,编写JUnit测试类MyServiceTest,使用`@RunWith(SpringJUnit4ClassRunner.class)`和`@ContextConfiguration`注解,注入并测试MyService的方法。此外,借助Mockito模拟依赖对象,以及使用Spring TestContext框架进行集成测试,确保测试的隔离性和环境的稳定性。通过这些方法,可以提升代码质量和测试效率。
246 1
|
运维 自然语言处理 Kubernetes
如何在 ACK 中使用 MSE Ingress
本文将为大家分享一下 Ingress 标准 和 实现的趋势,介绍一下 MSE Ingress 在这个趋势下的优势和实践,为大家做关键入口选择多一些参考。
650 100
如何在 ACK 中使用 MSE Ingress