总结:组合与排列
Posted cjoierzj
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了总结:组合与排列相关的知识,希望对你有一定的参考价值。
组合与排列的区别就是组合的数字可以重复,但是排列的不行;
eg:组合:1 2 3 3 2 1 3 1 2......但是排列就只有1 2 3
所以可以发现排列的数字是要按单调递增排列的,所以写代码时只要小小的改动一下就可以了,看一下例子:
例题一:输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字。
#include<bits/stdc++.h> using namespace std; int a[1000+1]; bool b[1000+1]; void search(int k); void print(); int n,num; int main(){ cin>>n; search(1); return 0; } void search(int k){ for(int i=1;i<=n;i++) if(!b[i]){ a[k]=i; b[i]=1; if(k==n) print(); else search(k+1); b[i]=0; } } void print(){ for(int i=1;i<=n;i++) cout<<setw(5)<<a[i]; cout<<endl; }
例题二:
【题目描述】
排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r≤n),我们可以简单地将n个元素理解为自然数1,2,…,n,从中任取r个数。
现要求你用递归的方法输出所有组合。
例如n=5,r=3,所有组合为:
1 2 3 1 2 4 1 2 5 1 3 4 1 3 5 1 4 5 2 3 4 2 3 5 2 4 5 3 4 5
【输入】
一行两个自然数n、r(1<n<21,1≤r≤n)。
【输出】
所有的组合,每一个组合占一行且其中的元素按由小到大的顺序排列,每个元素占三个字符的位置,所有的组合也按字典顺序。
【输入样例】
5 3
【输出样例】
1 2 3 1 2 4 1 2 5 1 3 4 1 3 5 1 4 5 2 3 4 2 3 5 2 4 5 3 4 5
#include<bits/stdc++.h> using namespace std; int n,m,b[1000000],a[1000000],c[100000]; int num=0; void search(int); void print(); int main(){ cin>>n>>m; search(1); } void search(int k){ for(int i=1;i<=n;i++){ if(!b[i]&&i>a[k-1]||k==1){//啦啦啦,这就是组合与排列的区别; a[k]=i; b[i]=1; if(k==m) print(); else search(k+1); b[i]=0; } } } void print(){ //num++; 用来统计的;这道题用不到 for(int i=1;i<=m;i++) cout<<setw(3)<<a[i]; cout<<endl; }
好啦,就是这样,好理解吧
以上是关于总结:组合与排列的主要内容,如果未能解决你的问题,请参考以下文章