不同元素的排列与组合


#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<numeric>
using namespace std;

vector<vector<int> > ret;
vector<int> sub;
int num = 0;

void helper(int* str, int n,int i) ///递归求组合
{
if(i == n)
{
ret.push_back(sub);
return;
}
helper(str, n,i+1);
sub.push_back(str[i]);
helper(str, n,i+1);
sub.pop_back(); ///看来这个要恢复场景~
}

void helper2(int* str, int n,int i)
{
if(i == n - 1)
{
num++;
cout<<num<<endl;
return ;
}

for(int j = i;j < n;j++)
{
swap(str[i],str[j]);
helper2(str, n,i + 1);
swap(str[i],str[j]);
}

}

int main()
{
ret.clear();
sub.clear();
int str[] = {1,2,3,4,5};
helper2(str, 5, 0);
//for(int i = 0;i< ret.size();i++)
//{
// for(int j = 0;j< ret[i].size();j++)
// cout<<ret[i][j]<<" ";
// cout<<endl;
//}
}

不同元素的排列与组合

时间: 2025-01-16 15:06:00

不同元素的排列与组合的相关文章

OI内的排列与组合(简单版)

§1基本原理 △让我们来看下面问题: 从甲地到乙地,可以乘火车,也可以乘汽车,还可以乘轮船.一天中,火车有4班,汽车有2班,轮船有3班.那么,一天中乘坐这些交通工具从甲地到乙地共有多少种不同走法?△分析:因为从甲地到乙地,乘火车有4种选择(方法),乘汽车有2种选择(方法),乘轮船有3种选择(方法).因此,一天中乘坐这些交通工具从甲地到乙地共有:4+2+3 = 9种不同的方法. ▲一般地,做一件事,完成它可以有n类方法,在第一类办法中有m1种不同的方法,在第二类办法中有m2种不同的方法,……,在第

蓝桥杯——说好的进阶之去重复元素的排列组合

将待排列(组合)的数组,先分别统计出种类和个数,然后进行避免重复的排列(组合). /* 1,1,2,3的排列组合 去重复 * (借此复习排列组合) * * 1:2 2个1 * 2:1 1个2 * 3:1 1个3 * * */ static int[] iarr = new int[3];//目标序列 static int[] carr = new int[] { 1, 2, 3 };//3种item static int[] used = new int[] { 2, 1, 1 };//每种it

字符串数组元素排列与组合的Java递归实现

排列与组合的Java递归实现 (参考) 我们在笔试面试过程中经常会遇到关于排列与组合的问题,其实这些可以通过递归简单的实现,看下面两个例子: (1)关于字符串排列的问题 输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串abc,则输出由字符a.b.c所能排列出来的所有字符串abc.acb.bac.bca.cab和cba. 可以这样想:固定第一个字符a,求后面两个字符bc的排列.当两个字符bc的排列求好之后,我们把第一个字符a和后面的b交换,得到bac,接着我们固定第一个字符b,求后面

排列与组合的一些定理

一,加法原理与乘法原理 加法原理与乘法原理是排列与组合的基础.加法原理本质上是分类,乘法原理本质上是分步. 分类,就是把一个集合(某事物)分成互不相交的若干独立的部分.比如,概率论中的全概率公式就将事件分成”全划分“ 分类思想可以简化程序的时间复杂度.比如:最短路径算法-Dijkstra算法的应用之单词转换(词梯问题) 分步,就是第一步干嘛,第二步再干嘛……比如A地到D地,第一步:先到达B地:第二步,再到达C地 二,排列 P(n,r)表示从n个数中选择r个数的一个全排列 公式:P(n,r)=P(

似兄弟的排列与组合

大家还记得我们在高中或者是在初中(具体什么时候忘记了)的时候在数学上学的排列与组合吗?记得那时候我的数学老师非得让我们把排列与组合的定义背的滚瓜烂熟的,但是,我到现在也背不上来,如今,在编程上又让我们相见,哈哈,缘分呐! 现在,就让我们一起回顾一下什么叫作排列,什么叫作组合吧. 1.排列 定义:在数学上--从n个不同元素中,任取m(m≤n,m与n均为自然数,下同)个元素按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列:从n个不同元素中取出m(m≤n)个元素的所有排列的个数,叫做

经典算法学习之分治法(以排列、组合程序为例)

分治法的思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归的求解这些子问题,然后再合并这些子问题的解来建立原问题的解. 分治法在每层递归是遵循的三个步骤: (1)分解原问题为若干个子问题,这些子问题是原问题的规模较小的实例. (2)解决这些子问题,队规的求解各个子问题,当子问题规模足够小的时候,直接求解. (3)合并这些子问题的解构成原问题的解. 显然归并排序是一个非常经典规矩的分治法的例子,鉴于之前已经写过一篇关于归并排序的博文,这里不在使用归并排序作为例子. 注意分治法的每一层递归

排列和组合的求解

1)使用“分类计数原理”还是“分步计数原理”要根据我们完成某件事时采取的方式而定,可以分类来完成这件事时用“分类计数原理”,需要分步来完成这件事时就用“分步计数原理”:那么,怎样确定是分类,还是分步骤?“分类”表现为其中任何一类均可独立完成所给的事件,而“分步”必须把各步骤均完成才能完成所给事件,所以准确理解两个原理强调完成一件事情的几类办法互不干扰,相互独立,彼此间交集为空集,并集为全集,不论哪类办法都能将事情单独完成,分步计数原理强调各步骤缺一不可,需要依次完成所有步骤才能完成这件事,步与步

模板C++ 02数论算法 3排列与组合

2.3排列与组合 1.排列(在乎顺序) 全排列:n个人全部来排队,队长为n.第一个位置可以选n个,第二位置可以选n-1个,以此类推得:P(n,n)=n(n-1)(n-2)--3*2*1=n!(规定0!=1). 部分排列:n个人选m个来排队(m<=n).第一个位置可以选n个,第二位置可以选n-1个,以此类推,第m个(最后一个)可以选(n-m+1)个,得: 2.组合(不在乎顺序) n个人m(m<=n)个出来,不排队,不在乎顺序C(n,m).如果在乎排列那么就是P(n,m),如果不在乎那么就要除掉重

数据结构中线性表的基本操作-合并两个线性表-依照元素升序排列

#include<iostream> #include<stdlib.h> #define LIST_INIT_SIZE 10/*线性表初始长度*/ #define LIST_CREATENT 2/*每次的增量*/ typedef int ElemType; using namespace std; typedef struct SqList/*线性表的数据结构定义*/ { ElemType *elem;/*线性表基址*/ int length;/*当前线性表所含的元素个数*/ i