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

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

目录
相关文章
|
1月前
【每日一题Day146】给定行和列的和求可行矩阵 | 贪心
【每日一题Day146】给定行和列的和求可行矩阵 | 贪心
27 0
|
1月前
【错题集-编程题】删除相邻数字的最大分数(动态规划 - 线性 dp)
【错题集-编程题】删除相邻数字的最大分数(动态规划 - 线性 dp)
|
1月前
|
机器学习/深度学习 人工智能 算法
【动态规划】【组合数学】【C++算法】920播放列表的数量
【动态规划】【组合数学】【C++算法】920播放列表的数量
|
1月前
|
人工智能 算法 数据可视化
【算法训练-数组 五】【数组组合】:下一个排列
【算法训练-数组 五】【数组组合】:下一个排列
30 0
|
6月前
|
算法 测试技术 C#
C++单调向量算法:132 模式解法三枚举1
C++单调向量算法:132 模式解法三枚举1
|
10月前
|
算法
排列组合算法
排列组合算法
|
存储 算法
回溯算法:排列与组合详解
回溯算法,本质上是一种穷举算法,属于暴力搜索算法的一种。它虽然可以使用剪枝进行优化,仍不高效,但却实用。它往往能够解决可以抽象成树形结构的问题,亦可以认为是使用 K 层 for循环实现搜索的问题。
117 0
回溯算法:排列与组合详解
|
算法
LeetCode 38外观数列&39组合总和
给定一个正整数 n(1 ≤ n ≤ 30),输出外观数列的第 n 项。
85 0
LeetCode 38外观数列&39组合总和
|
算法 索引
秒杀组合、排列与子集(回溯算法)
秒杀组合、排列与子集(回溯算法)
|
机器学习/深度学习
【组合数学】鸽巢原理 ( 鸽巢原理简单形式 | 鸽巢原理简单形式示例 1、2、3 )
【组合数学】鸽巢原理 ( 鸽巢原理简单形式 | 鸽巢原理简单形式示例 1、2、3 )
103 0
【组合数学】鸽巢原理 ( 鸽巢原理简单形式 | 鸽巢原理简单形式示例 1、2、3 )