组合+排列 以及伯努利装错信封问题思路

简介: 这段代码是C++实现的一个程序,用于计算从`n`个不同元素中选择`m`个进行排列的组合总数(排列问题)。用户输入`n`和`m`,程序通过循环和条件判断生成所有可能的排列,并输出排列的总数。核心逻辑是使用回溯法,当找到一个满足条件(不包含重复元素)的排列时,更新计数器并继续寻找下一个排列。

#include<bits/stdc++.h>

using namespace std;

int main(){

int n,m,i=1,g=1,rankNumber=0;//从n个里面选m个排列

int a[100];

cout<<"A(n,m)输入n,m(n>m):";

cin>>n>>m;

a[i]=1;

while(1)

{

 g=1;//默认满足条件  

 for(int j=i-1;j>=1;j--){//循环遍历判断和选出来的元素有没有重复的  

  if(a[i]==a[j])

  {

   g=0;//如果有重复的元素,改为不满足条件  

   break;

  }

 }

 if(g&&i==m)//如果满足条件,且选出了所有要选元素  

 {

  rankNumber++;//记录有多少种情况  

  for(int j=1;j<=m;j++)//循环遍历输出选出的元素  

  {

   cout<<a[j]<<" ";

  }

  cout<<endl;

 }

 if(g&&i<m)//如果满足条件,且未选所有要选的的元素  

 {

  i++;//继续选择下一个元素  

  a[i]=1;//下一个元素从1开始  

  continue;

 }

 while(i>1&&a[i]==n)i--;//如果当前元素已经达到最大值,无法继续选出下一个元素,向前回溯  

 if(i==1&&a[i]==n)//第一个元素到达最大值,且无法选出下一个元素  

 {

  break;

 }

 else

 {

  a[i]+=1;//使当前元素+1作为下一种排列  

 }

 

}

cout<<"A("<<n<<","<<m<<"):"<<rankNumber;  

return 0;

}  

//伯努利装错信封问题需要在选择条件中使a[]数组对应位置的i的值不等于i  

目录
相关文章
|
存储 Java
数论——因子组合
数论——因子组合
|
8月前
|
存储 Python
处理随机元素来创建数列是一个涉及随机数生成和数列构造的过程
处理随机元素来创建数列是一个涉及随机数生成和数列构造的过程
72 0
|
算法 测试技术 C#
C++单调向量算法:132 模式解法三枚举1
C++单调向量算法:132 模式解法三枚举1
|
存储 算法
回溯算法:排列与组合详解
回溯算法,本质上是一种穷举算法,属于暴力搜索算法的一种。它虽然可以使用剪枝进行优化,仍不高效,但却实用。它往往能够解决可以抽象成树形结构的问题,亦可以认为是使用 K 层 for循环实现搜索的问题。
168 0
回溯算法:排列与组合详解
排列组合算法
排列组合算法
|
存储 算法
一文搞懂全排列、组合、子集问题
Hello,大家好,我是bigsai,long time no see!在刷题和面试过程中,我们经常遇到一些排列组合类的问题,而全排列、组合、子集等问题更是非常经典问题。本篇文章就带你彻底搞懂全排列!
197 0
一文搞懂全排列、组合、子集问题
|
算法 索引
秒杀组合、排列与子集(回溯算法)
秒杀组合、排列与子集(回溯算法)
|
算法 前端开发 搜索推荐
【组合数学】生成函数 ( 正整数拆分 | 无序不重复拆分示例 )
【组合数学】生成函数 ( 正整数拆分 | 无序不重复拆分示例 )
332 0
|
机器学习/深度学习 移动开发
【组合数学】排列组合 ( 集合排列、分步处理示例 )
【组合数学】排列组合 ( 集合排列、分步处理示例 )
193 0