
前言:高中数学第一册介绍了集合、排列组合的概念(我怎么会知道这些?)。
排列问题,在n个元素中选出长度为m的排列,当m=n时即为全排列,本文介绍通用一些的算法:即“n个元素中选出长度为m排列”的写法,记为f(n,m)。OJ上只要调用f(n,n)即可。
不同于全排列的是,f(n,m)不能用教材上swap交换的方式。实设计算法最基础方式就是用人解决问题的处理方法(模拟法、暴力法)。试想下如果让你在纸上写出abcde,长度为3的所有排列组合,你会怎么处理?
第一个字符有5种选择,假如这次选a;
第二个字符有4种选择,不能选a(a上次已被选中,你是用大脑记录这个信息的),假如选b;
第三个字符有3种选择,不能选a和b,选c则得到一种排列abc,选d得到abd,选e得到abe;
然后退回到第二个字符选c............
解题思路:用标准递归法,每层递归选择一个字符,用一个字符数组ans存储选中字符序列,用一个标记数组v记录哪些字符已经被选中,当递归到第m+1步时递归结束,输出排列。(友情提示:本代码已开启防抄袭模式,请勿复制粘贴)
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
char a[15],ans[15];
bool v[15];
int id=0;
void f(int n,int m,int cur)/**< cur(current)当前是第几个字符 */
{
if(cur==m+1)/**< 当前是m+1,说明前m个已经选好了 */
{
cout<<(++id)<<

该博客介绍了如何使用C++编程实现从n个元素中选取m个进行排列的算法,通过递归方法模拟人脑解决排列问题的过程。代码中包含了一个防止抄袭的提示,并提供了全排列的实现。文章首先阐述了排列的概念,然后通过示例解释了解题思路,最后给出了完整的C++代码实现。
最低0.47元/天 解锁文章
367

被折叠的 条评论
为什么被折叠?



