zoukankan      html  css  js  c++  java
  • 排列组合

    这两个函数都包含在algorithm库中。STL提供了两个用来计算排列组合关系的算法,分别是next_permutation和prev_permutation。

    一、函数原型

    首先我们来看看这两个函数的函数原型:

    • next_permutation:
    1 template< class BidirIt >bool next_permutation( BidirIt first, BidirIt last );
    2 template< class BidirIt, class Compare >bool next_permutation( BidirIt first, BidirIt last, Compare comp );
    • prev_permutation:
    1 template< class BidirIt >bool prev_permutation( BidirIt first, BidirIt last);
    2 template< class BidirIt, class Compare >bool prev_permutation( BidirIt first, BidirIt last, Compare comp);

    1.参数

    first,end ——重新排序的元素范围

    comp —— 自定义比较函数

    顾名思义,next_permutation就是求下一个排列组合,而prev_permutation就是求上一个排列组合。首先我们必须了解什么是“下一个”排列组合,什么是“前一个”排列组合。考虑由三个字符所组成的序列{a,b,c}。

    那么按照字典序排升序他们一共有下面这几种排列方式:

    • abc
    • acb
    • bac
    • bca
    • cab
    • cba

    如果给定排列方式P,令P为{acb},那么next_permutation即求P+1也就是{bac},prev_permutation也就是求P-1即为{abc}。当然也可以自定义谓词函数进行自定义的“下一个排列组合”。

    二、代码演示

    下面是示范代码:

    #include <algorithm>
    using namespace std;
    
    int main() {
        int a[] = { 1,2,3 };
        do {
            for (int i = 0; i < 3; i++) cout << a[i] << ' ';
            cout << endl;
        } while (next_permutation(a, a + 3));
    
        cout << endl;
        do {
            for (int i = 0; i < 3; i++) cout << a[i] << ' ';
            cout << endl;
        } while (prev_permutation(a, a + 3));
        return 0;
    }

    预计上面代码的运行结果应该是输出两组1,2,3的排列组合方式,共12行,但实际运行结果如下:

    Why?

    我们试着输出第一个循环后a数组的排列方式,结果会得到1 2 3,这是因为当next_permutation去找下一个排列组合P+1,找到则排列为下一个排列组合返回true,否则数组变成字典序最小的排列组合(即为重置排列)并返回false,prev_permutation也同理。

    https://www.cnblogs.com/xenny/p/10192983.html

  • 相关阅读:
    【(高职专科组)第十一届蓝桥杯省模拟赛答案】给定一个数列,请问找出元素之间最大的元素距离。
    【(高职专科组)第十一届蓝桥杯省模拟赛答案】给定一个数列,请问数列中最长的递增序列有多长。
    POJ 2391 二分+最大流
    HDU 4529 状压dp
    NYOJ 747贪心+dp
    NYOJ 745 dp
    HDU 2686 / NYOJ 61 DP
    HDU 4313树形DP
    HDU 4303 树形DP
    POJ 2342 树形DP
  • 原文地址:https://www.cnblogs.com/leijiangtao/p/3608888.html
Copyright © 2011-2022 走看看