当前位置: 首页 > news >正文

题解:洛谷 P1157 组合的输出

【题目来源】

洛谷:P1157 组合的输出 - 洛谷 (luogu.com.cn)

【题目描述】

排列与组合是常用的数学方法,其中组合就是从 \(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\lt n\lt 21,0\le r\le n)\)

【输出】

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

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

cout << setw(3) << x;

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

【输入样例】

5 3 

【输出样例】

  1  2  31  2  41  2  51  3  41  3  51  4  52  3  42  3  52  4  53  4  5

【解题思路】

image

image

【算法标签】

《洛谷 P1157 组合的输出》 #搜索# #递归# #排列组合#

【代码详解】

#include <bits/stdc++.h>
using namespace std;int n, k, b[25] = {0};  // 定义全局变量:n-总数,k-选择数,b-标记数组// 输出当前组合
void shuchu() {for (int i = 1; i <= n; i++) {if (b[i]) cout << setw(3) << i;  // 输出被选中的数字,宽度为3}cout << endl;  // 换行
}// 递归生成组合
void f(int flag, int num) {// flag: 当前起始位置// num: 剩余需要选择的数字个数// 终止条件:已选够k个数字if (num == 0) {shuchu();  // 输出当前组合return;}// 剪枝:剩余数字不足以选够k个if (n - flag + 1 < num) return;// 递归枚举所有可能的组合for (int i = flag; i <= n; i++) {b[i] = 1;       // 选择当前数字f(i + 1, num - 1);  // 递归处理后续数字b[i] = 0;       // 回溯,取消选择}
}int main() {cin >> n >> k;  // 输入总数n和选择数kf(1, k);        // 从第1个位置开始,选择k个数字return 0;
}
#include <bits/stdc++.h>
using namespace std;int n, r, a[10];  // 定义全局变量:n-总数,r-选择数,a-存储当前组合// 深度优先搜索生成组合
void dfs(int step, int num) {// step: 当前选择的第几个数字(从1到r)// num: 当前可选的起始数字(保证组合有序避免重复)// 终止条件:已选够r个数字if (step > r) {// 输出当前组合(每个数字占5位宽度)for (int i = 1; i <= r; i++) {cout << setw(5) << a[i];}cout << endl;return;}// 枚举所有可能的数字(从num到n)for (int i = num; i <= n; i++) {a[step] = i;          // 选择当前数字dfs(step + 1, i + 1); // 递归选择下一个数字(保证升序)a[step] = 0;          // 回溯(可省略,因为会被覆盖)}
}int main() {cin >> n >> r;  // 输入总数n和选择数rdfs(1, 1);      // 从第1个位置开始,起始数字为1return 0;
}

【运行结果】

5 31  2  31  2  41  2  51  3  41  3  51  4  52  3  42  3  52  4  53  4  5
http://www.jsqmd.com/news/389898/

相关文章:

  • 题解:洛谷 P2089 烤鸡
  • 题解:洛谷 P1036 [NOIP 2002 普及组] 选数
  • 题解:洛谷 P1618 三连击(升级版)
  • lanqiaoOJ 1020:阶乘约数 ← 整数唯一分解定理 + 约数个数定理
  • 题解:洛谷 P2241 统计方形(数据加强版)
  • 综述不会写?千笔,王者级的AI论文写作软件
  • 定稿前必看!更贴合继续教育的AI论文平台,千笔·专业论文写作工具 VS WPS AI
  • 08]delphi10.3剪贴板的图片,保存到文件
  • 评测2026年主流安检设备,揭秘可靠直销渠道,安检门/智能安检/安检仪/金属探测门/安检设备,安检设备源头厂家哪家好 - 品牌推荐师
  • 数据码农马年大吉
  • 定稿前必看!9个降AIGC工具测评:本科生降AI率必备指南
  • 导师推荐!继续教育论文神器 —— 千笔AI
  • 格式总出错?千笔AI,全民喜爱的AI论文写作软件
  • 新手也能上手 9个降AI率工具:研究生降AI率全维度测评
  • 生产环境VSCode中ESLint与Prettier冲突终极解决方案(90%开发者都踩过的坑)最佳实践与性能优化
  • 导师推荐 10个 AI论文写作软件:研究生毕业论文与科研写作必备工具测评
  • 吐血推荐! AI论文平台 千笔AI VS speedai,自考写论文必备神器!
  • 拖延症福音!降AI率平台 千笔AI VS PaperRed,自考党必备
  • AI岗位真的比网安岗位强多了?我们是否该“All in AI Agent”?——一场关于技术趋势、安全边界与职业选择的深度思辨
  • 用数据说话 AI论文写作软件 千笔ai写作 VS Checkjie 更贴合自考需求
  • 科研党收藏!千笔AI,冠绝行业的降AI率平台
  • 深入解析:Linux:信号保存下(信号二)
  • Metasploit Framework 6.4.115 (macOS, Linux, Windows) - 开源渗透测试框架
  • 【Windows】终末地导致的System进程异常高占用内存和磁盘资源##36
  • Go错误处理与日志记录:构建健壮且可观测的应用
  • Nodejs+vue3的云端网上书城 图书商城销售听书系统
  • 2026必备!千笔,自考降重神器 —— 风靡全网
  • Nodejs+vue3的家政系统的设计与实现开题
  • 如何在豆包做广告推广?怎么联系豆包AI获客服务商? - 品牌2025
  • 网络安全一周要闻:ATM恶意软件、暴露的AI系统与微软Office零日漏洞