【C++基础】递归进阶之全排列、组合
创始人
2025-05-28 13:15:23
0

1.排列组合

排列:从n个元素中任取m个元素,按照一定的顺序排列起来,叫做m的全排列。

组合:从n个元素中任取m个元素为一组,m个数的组合。

注意: 排列有序,组合无序。

例:从[1,2,3]三个元素中任取两个元素进行排列组合:

排列的结果:[1,2] 、[1,3]、[2,1]、[2,3]、[3,1]、[3,2]

组合的结果:[1,2]、[1,3]、[2,3]

例题:n个元素的全排列,(n互不相同,即1,2,······n).

#include
#include
using namespace std;  
//n个数全排列 :一定要知道在第几层,该数现在的状态,回溯时的状态 int n;
int a[1000];
bool flag[1000];
void dfs(int k){if(k==n+1){  //递归结束条件,当到达第n+1层,代表第n层已经填完 for(int i=1; i<=n; i++){cout<>n;dfs(1);  //从第一层(第一个位置)开始排列 return 0;
}

程序运行如下:

例2:n个数选m个数全排列

#include
#include
using namespace std;  
//n个数选m个数全排列 :一定要知道在第几层,该数现在的状态,回溯时的状态 int n,m;
int a[1000];
bool flag[1000];
void dfs(int k){if(k==m+1){  //递归结束条件,当到达第m+1层,代表第m层已经填完 for(int i=1; i<=m; i++){cout<>n>>m;dfs(1);  //从第一层(第一个位置)开始排列 return 0;
}

程序运行如下:

例3:n个不同的元素,任取m个数进行组合。(组合无序)

#include
#include
using namespace std;  
//n个数选m个数组合 :当前位置数值比前一个数至少大1,
//a[k]代表当前位置上的值,它的范围是[a[k-1]+1,n] int n,m;
int a[1000];void dfs(int k){if(k==m+1){  //递归结束条件,当到达第m+1层,代表第m层已经填完 for(int i=1; i<=m; i++){cout<>n>>m;dfs(1);  //从第一层(第一个位置)开始排列 return 0;
}

程序运行如下:

2.铺骨牌问题

有一个1*n的长方形,用1*1、1*2、1*3的骨牌铺满方格,共有几种铺法。

分析如下:

本题采用递归函数,当确定最后一块方式后,只需看前面的格子共有几种铺法即可。而最后一个格子的铺法不确定,所以要各种方案的总方案数相加才行。

即:f(n)=f(n-1)+f(n-2)+f(n-3).

 程序如下:

#include
#include
using namespace std;  
int f(int x){if(x==1) return 1;  if(x==2) return 2;if(x==3) return 4;return f(x-1)+f(x-2)+f(x-3);  //共三种格子 //f(x)的方案数为 末尾放1*1,前面总方案为f(x-1);//尾放1*2,前面总方案为f(x-2); 尾放1*3,前面总方案为f(x-3)  
}
int main(){int n;cin>>n;cout<

总结

本文简单介绍了排列组合的一些基本做题思路,全排列一定要注意当前位置在第几层,当前数字是否用过,并注意回溯时数字的状态。

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...