RELATEED CONSULTING
相关咨询
选择下列产品马上在线沟通
服务时间:9:30-18:00
你可能遇到了下面的问题
关闭右侧工具栏
计数法的组合的算法
  • 作者:zhaozj
  • 发表时间:2020-12-23 10:54
  • 来源:未知

// Copyright (C) 2004 BenBear//// This file is an algorithm of combination.  This library is free// software; you can redistribute it and/or modify it under the// terms of the GNU General Public License as published by the// Free Software Foundation; either version 2, or (at your option)// any later version.

// This library is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License along// with this library; see the file COPYING.  If not, write to the Free// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,

#include <iostream>#include <cstdlib>using namespace std;

template <typename BiIter>inline void__combi_reverse (BiIter first, BiIter last){    reverse (first, last);}

template <typename BiIter>boolnext_combination_count (BiIter first, BiIter last){    if (first == last)        return false;        BiIter i = last;    if (--i == first)        return false;        if (*i-- == 0)    {        while ((i != first) && (*i == 0))            --i;        if (*i == 0)            return false;        BiIter j = i;        iter_swap (i, ++j);        return true;    }        while ((i != first) && (*i == 1))        --i;        if (i == first)    {        if (*i == 0)            iter_swap (first, --last);        return false;    }        BiIter ii = i;    while ((--ii != first) && (*ii == 0))        ;    if (*ii == 0)    {        __combi_reverse (first, last);        return false;    }        BiIter jj = ii;    iter_swap (ii, ++jj);    __combi_reverse (++jj, last);    return true;}

template <typename BiIter>boolprev_combination_count (BiIter first, BiIter last){    if (first == last)        return false;        BiIter i = last;    if (--i == first)        return false;        while ((i != first) && (*i == 0))        --i;    if (i == first)    {        if (*i == 1)            iter_swap (first, --last);        return false;    }        BiIter j = i;    --j;    if (*j == 0)    {        iter_swap (i, j);        return true;    }        while ((--j != first) && (*j == 1))        ;    if (*j == 1)    {        __combi_reverse (first, last);        return false;    }        BiIter jj = j;    iter_swap (j, ++jj);    __combi_reverse (++jj, last);    return true;}