排列与组合(permutation combination)

一、排列的定义及公式:

从N个不同的元素中,任取M(M与N均为自然数,下同)个元素按照一定的顺序排成一列,叫做从N个不同元素中取出M个元素的一个排列;
从N个不同的元素中取出M个元素的所有排列的个数,叫做从N个不同元素中取出M个元素的一个排列数;公式为:

二、组合的定义及公式

从N个不同的元素中,任取M(M与N均为自然数,下同)个元素组成一组,叫做从N个不同元素中取出M个元素的一个组合;
从N个不同的元素中取出M个元素的所有组合的个数,叫做从N个不同元素中取出M个元素的一个组合数;公式为:

三、计算排列及组合的代码实现:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/****************************************************************
 * C++  计算排列数和组合数
 * date:20222-5-3
 * version: 1.0
 * author: Alex Li
 ****************************************************************/ 

#include <iostream>
using namespace std;
int fact(int n) {
   if (n == 0 || n == 1)
   return 1;
   else
   return n * fact(n - 1);
}
int main() {
   int n, m, comb, per;
   cout<<"Enter N : ";
   cin>>n;
   cout<<"\nEnter M : ";
   cin>>m;
   comb = fact(n) / (fact(m) * fact(n-m));
   cout << "\nCombination : " << comb;
   per = fact(n) / fact(n-m);
   cout << "\nPermutation : " << per;
   return 0;
}


四、给定字符串,输出全排列:

代码实现:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/**************************************************************** 
 * Description: print all permutations of a given string 字符串全排列
 * Author: Alex Li
 * Date: 2023-01-20 16:45:45
 * LastEditTime: 2023-07-08 12:16:04
****************************************************************/

#include <iostream> 
using namespace std; 

//字符串全排列
void permute(string a, int l, int r){ 
	// Base case 
	if (l== r) 
		cout<<a<<' '; 
	else{ 
		// Permutations made 
		for (int i = l; i <= r; i++) { //是字母l,不是数字1
			// Swapping done  遍历每个元素到[l,r]的第一个位置
			swap(a[l], a[i]);   
			// Recursion called 递归,缩小范围
			permute(a, l+1, r);
			swap(a[i],a[l]); //回溯,保证字符串顺序正确
		} 
	} 
} 

// Driver Code 
int main() { 
	string str;
    cout<<"please input a string: ";
    cin>>str; 
	int n = str.size(); 
	permute(str, 0, n-1); 
	return 0; 
} 


五、从一个字符串中取m个元素排列:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/**************************************************************** 
 * Description: permutation of string and m 从字符串中选取m个元素的排列
 * Author: Alex Li
 * Date: 2023-07-07 14:15:34
 * LastEditTime: 2023-07-08 12:15:02
****************************************************************/

#include <iostream> 
using namespace std; 
int m;

//字符串全排列
void permute(string a, int l, int r){ 
	if(m==0)return;
	// Base case 
	if (l==m){
        for (int i = 0; i <m; i++)cout<<a[i];
		cout<<' '; 
	}
	else{ 
		// Permutations made 
		for (int i = l; i <= r; i++) { //是字母l,不是数字1
			// Swapping done  遍历每个元素到[l,r]的第一个位置
			swap(a[l], a[i]);   
			// Recursion called 递归,缩小范围
			permute(a, l+1, r);
		} 
	} 
} 

// Driver Code 
int main() { 
	string str;
		
    cout<<"please input a string: ";
    cin>>str; 
	cout<<"please input the length of substring: ";
	cin>>m;
	int n = str.size(); 
	permute(str, 0, n-1); 
	return 0; 
} 


七、给定一个字符串,取r个元素,输出组合

代码实现:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/**************************************************************** 
 * Description: C++ program to print all combination of size r in an array of size n
 * Author: Alex Li
 * Date: 2023-07-07 14:15:34
 * LastEditTime: 2023-07-10 21:01:39
****************************************************************/
#include <iostream> 
using namespace std; 
//a是原字符串,d是用于存放输出组合元素的字符串,start 和end是标识a数组,index和r是标识d数组。
void Combination(string a, string  d,int start, int end, int index, int r){
	 
	 if(index==r){
		for (int  j = 0; j<r; j++)cout<<d[j];
		cout<<" ";
		return ;		
	 }

	 for (int i =start; i <=end; i++){ 
		d[index]=a[i];
		Combination(a,d,i+1,end,index+1,r);
	 }
}

int main(){
string str;
	int r;	
    cout<<"please input a string: ";
	cin>>str;
    cout<<"please input the length of substring: ";
	cin>>r;
	string data;  //临时存储组合数
	int n=str.size();
	Combination(str,data,0,n-1,0,r);
}
 

洛谷:P1157

Scroll to Top