题目相关

题目描述

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

现要求你输出所有组合。

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

12 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<n<21,0≤rn)。

输出格式

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

**注意哦!输出时,每个数字需要3个场宽,pascal可以这样:

write(ans:3);

输入输出样例

输入

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

题目链接

P1157 组合的输出 - 洛谷

分析

阅读完题目,发现本题就是让我们从 1 ~ n个数中选出r个数,输出所有的组合,并且部分顺序。且对输出做出了一定的要求,元素要从小到大排列,且占三个场宽。

占三个场宽可以使用printf来实现,注意加上头文件cstdio

printf("%3d",x);//输出元素占3个场宽

选择的过程和全排列问题有些类似。每次都是从一堆数字中选一个出来加入组合,等挑完r个元素后,就输出。过程中要注意一点,他需要从小到大排列。那么我们可以使得挑选的数字比前一个选的大,这样就可以了。而不是说,选出所有的数字之后再去筛选,这样反而麻烦很多。

for(int i=ranks[pre]+1;i<=n;i++){//遍历比前一个元素大的数字
ranks[pre+1]=i;//存到组合序列中
...
}

代码实现

#include <iostream>
#include <cstdio>
using namespace std; int n,r;
int ranks[25]={0};//存放选好的r个数字 void dfs(int sel){
//已选好sel个数字
if(sel==r){
for(int i=1;i<=r;i++){
printf("%3d",ranks[i]);
}
cout<<endl;
}else{//还未挑选好
//挑选第sel+1个数字
//其中的元素按由小到大的顺序排列
// 我的第sel+1个数字> 第sel个 ranks[sel]
for(int i=ranks[sel]+1;i<=n;i++){//第sel+1 个数字可能的值
//挑选i 存放进ranks数组中
//第sel+1 个 => ranks[sel]
ranks[sel+1]=i;
//已经选好了sel+1个数字
//递归调用 ,继续寻找下一个
dfs(sel+1);
} }
} int main() {
cin>>n>>r;
dfs(0);
return 0;
}

【递归】P1157组合的输出的更多相关文章

  1. 洛谷 P1157 组合的输出

    P1157 组合的输出 题目描述 排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r<=n),我们可以简单地将n个元素理解为自然数1,2,…,n,从中任取r个数. 现 ...

  2. P1157 组合的输出

    P1157 组合的输出 #include <bits/stdc++.h> using namespace std; int n,r; int a[25]; vector<int> ...

  3. 洛谷P1157 组合的输出

    洛谷1157 组合的输出 题目描述 排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r<=n),我们可以简单地将n个元素理解为自然数1,2,…,n,从中任取r个数. ...

  4. 组合的输出(回溯、dfs)

    问题 O: [回溯法]组合的输出 题目描述 排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r<=n),我们可以简单地将n个元素理解为自然数1,2,…,n,从中任取r ...

  5. (Java实现) 组合的输出

    问题 B: [递归入门]组合的输出 时间限制: 1 Sec 内存限制: 128 MB 题目描述 排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r < = n),我们 ...

  6. 【递归入门】组合的输出:dfs

    题目描述 排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r < = n),我们可以简单地将n个元素理解为自然数1,2,…,n,从中任取r个数. 现要求你不用递归的方 ...

  7. 组合的输出(DFS)

    题目描述: 排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r<=n),我们可以简单地将n个元素理解为自然数1,2,…,n,从中任取r个数. 现要求你用递归的方法输出 ...

  8. T1317:【例5.2】组合的输出

    [题目描述] 排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r≤n),我们可以简单地将n个元素理解为自然数1,2,…,n,从中任取r个数. 现要求你用递归的方法输出所有组 ...

  9. <经验杂谈>介绍Js简单的递归排列组合

    最近在开发SKU模块的时候,遇到这样一个需求,某种商品有N(用未知数N来表示是因为规格的数组由用户制定且随时可以编辑的,所以对程序来说,它是一个未知数)类规格,每一类规格又有M个规格值,各种规格值的组 ...

随机推荐

  1. python xlsxwriter创建excel 之('Exception caught in workbook destructor. Explicit close() may be required for workbook.',)

    python2.7使用xlsxwriter创建excel ,不关闭xlsxwriter对象,会报错: Exception Exception: Exception('Exception caught ...

  2. git 常用命令 command

    git config --list //查看配置信息   git config user.name //查看用户名  git config user.email //查看用户邮箱 从远程克隆到本地仓库 ...

  3. js 几种跨域解决方法

    同源策略: JS只能与同一个域中的页面进行通讯,必须是协议.域名.端口都相同,相同域下才能相互通信,这可以被认为是一种通信原则,叫同源策略. 跨域: js跨域是指通过js在不同的域之间进行数据传输或通 ...

  4. 题解 CF504E 【Misha and LCP on Tree】

    PullShit 倍增和树剖的差距!!! 一个 TLE, 一个 luogu 最优解第三!!! 放个对比图(上面倍增,下面轻重链剖分): 不过这是两只 log 非正解... Solution \(LCP ...

  5. 题解-CmdOI2019 口头禅

    题面 CmdOI2019 口头禅 给 \(n\) 个 \(01\) 串 \(s_i\),\(m\) 个询问问 \(s_{l\sim r}\) 的最长公共子串长度. 数据范围:\(1\le n\le 2 ...

  6. MySQL的验证方式

    mysql8之后root用户的密码验证方式修改了,mysql8的加密方式为caching_sha2_passoword,而navicat连接所用的方式为native_password. 使用命令mys ...

  7. 手动实现Promise.all()

    Promise.all()方法用于将多个 Promise 实例,包装成一个新的 Promise 实例. Promise.all()方法的参数可以不是数组,但必须具有 Iterator 接口,且返回的每 ...

  8. Kubernetes【K8S】(二):搭建Kubernetes环境

    系统初始化 设置系统时区 # 设置系统时区为 亚洲/上海 [root@k8s-master01 ~]# timedatectl set-timezone Asia/Shanghai # 设置当前得UT ...

  9. c预处理和宏

    文件的预处理 #include "xxx.h" 1 首先查找当前源文件所在的路径 2 查找工程的头文件搜索路径 #include <xxxx.h> 查找工程的头文件搜索 ...

  10. 工作三年!全靠大佬的Java笔记,年底跳槽阿里涨了10K

    前言 不论是校招还是社招都避免不了各种⾯试.笔试,如何去准备这些东⻄就显得格外重要,之前8月底阿里的人事部门打电话叫我要不要面试,当时正处于换工作的期间,于是就把简历发给阿里hr,人事审核后经过一些列 ...