总结:组合与排列

组合与排列的区别就是组合的数字可以重复,但是排列的不行;

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;
}

好啦,就是这样,好理解吧

原文地址:https://www.cnblogs.com/cjoierzj/p/9818336.html

时间: 2024-10-09 04:02:40

总结:组合与排列的相关文章

代码题(19)— 组合与排列

1.77. 组合 给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合. 示例: 输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] class Solution { public: vector<vector<int>> combine(int n, int k) { vector<vector<int>> res; vector<int>

itertools库 combinations() 和 permutations() 组合 和 排列选项的方法

combinations方法重点在组合,permutations方法重在排列. combinations和permutations返回的是对象地址,原因是在python3里面,返回值已经不再是list,而是iterators(迭代器), 所以想要使用,只用将iterator 转换成list 即可 原文地址:https://www.cnblogs.com/kaibindirver/p/10714375.html

组合与排列

目录 集合的排列 集合的组合 集合的排列 对于正整数 \(n\) 和 \(r\) ,\(r \leq n\) 有 \[P(n,r)=n\times(n-1)\times(n-2)\times\dots (n-r+1)\] 定义 \(n!\) \[n!=1 \times 2\times 3\times \dots \times n\] 约定 \[0!=1\] 于是 \[P(n,r)=\frac{n!}{(n-p)!}\] 循环 \(r\) 排列的个数为 \[\frac{P(n,r)}{r}=\fr

【错位+组合】排列计数

题目描述 求有多少种长度为n的序列A,满足以下条件:1~n这n个数在序列中各出现了一次若第i个数A[i]的值为i,则称i是稳定的.序列恰好有m个数是稳定的满足条件的序列可能很多,序列数对10^9+7取模. 输入 第一行一个数 T,表示有 T 组数据.接下来 T 行,每行两个整数 n.m.T=500000,n≤1000000,m≤1000000 输出 输出T行,每行一个数,表示求出的序列数 样例输入 5 1 0 1 1 5 2 100 50 10000 5000 样例输出 0 1 20 57802

排列组合相关算法 python

获取指定长度得所有序列 通过事件来表述这个序列,即n重伯努利实验(二项分布)的所有可能结果.例如时间a表示为: a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 假设每次实验为从a中选择一个数字,那么进行n次实验,获得所有可能得序列. 比如,进行两次实验, n=2, 那么可能得结果有100个.这里因为每次实验都是相对独立的,所以每次实验的结果可能出现重复,也就是说在获得所有可能的序列中,可以存在重复得值. 递归实现,DFS(深度优先遍历) def gen_all_seque

【原创】开源.NET排列组合组件KwCombinatorics使用(三)——笛卡尔积组合

你还可以参考本博客其他.NET开源项目的相关文章: [原创]彩票预测算法:离散型马尔可夫链模型          Newlife XCode组件资源目录汇总[2013年版] [原创]开源.NET下的XML数据库介绍及入门          [原创].NET开源压缩组件介绍与入门 [开源].NET开源表达式计算组件介绍与使用          [原创]开源Word读写组件DocX介绍与入门 [原创]Matlab.NET混编调用Figure窗体                [原创]Matlab与.

STL_算法(17)_排列组合 next_permutation() perv_permutation()

next_permutation() prev_permutation() #include<iostream> #include<algorithm> #include<vector> // 排列组合开始之前一定要先排序 using namespace std; int main() { vector<int> ivec; ivec.push_back(1); ivec.push_back(2); ivec.push_back(3); for (vecto

排列组合问题(递归实现)

在做递归问题时,要保证对递归跳跃的信任,继而对相应的问题寻找其递归实现 (1)组合:先从原始数组中选择一个,再从剩下的集合中选择m-1个:而后,再从剩下的集合中挑选m个元素. /*组合代码(eg:5选2)*/ int a[5]={1,2,3,4,5};//原始数组 int b[2];//挑选的结果 const int need=2;//需要选择的个数 void combine(int start,int end,int x) { if(x==need) { //(1)打印组合的内容 /* for

计算机算法基础 ——数学(排列组合函数)

一 排列 1.从n个元素中取r个元素排列的全体数目 Pnr=P(n,r)=n(n-1)(n-2)...(n-r+1)=n!/(n-r)!                  :例:n个球取r个放入r个不同盒子,每个盒子一个球,多少种放法 2. n个元素的全排列 Pnn=P(n,n)=n! 3.例:随机选n(n<365)个人,求其中至少有两人生日相同的概率. n个人的生日的序列数:365n n个人生日均不相同的概率:P(365,n) 故:1-P(365,n)/365n 4.圆排列 从n个元素中取r个