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

简介: 这段代码是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  

目录
相关文章
|
9月前
【每日一题Day146】给定行和列的和求可行矩阵 | 贪心
【每日一题Day146】给定行和列的和求可行矩阵 | 贪心
64 0
|
9月前
|
人工智能 BI
经典问题之区间分组
经典问题之区间分组
排列组合算法
排列组合算法
|
算法 内存技术
求组合数三种算法
求组合数三种算法
99 0
|
存储 算法
四式解决回溯算法:组合+组合总和
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。
706 3
再学一道算法题: 两个有序序列的中位数
再学一道算法题: 两个有序序列的中位数
再学一道算法题: 两个有序序列的中位数
|
算法 搜索推荐
漫画算法:无序数组排序后的最大相邻差值
漫画算法:无序数组排序后的最大相邻差值
145 0
漫画算法:无序数组排序后的最大相邻差值
|
算法 索引
秒杀组合、排列与子集(回溯算法)
秒杀组合、排列与子集(回溯算法)
【组合数学】生成函数 ( 正整数拆分 | 无序不重复拆分示例 )
【组合数学】生成函数 ( 正整数拆分 | 无序不重复拆分示例 )
340 0
|
机器学习/深度学习 移动开发
【组合数学】排列组合 ( 集合排列、分步处理示例 )
【组合数学】排列组合 ( 集合排列、分步处理示例 )
199 0