# 计数法的组合的算法

//
// This file is an algorithm of combination.  This library is free
// software; you can redistribute it and/or modify it under 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>
bool
next_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>
bool
prev_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;
}

//  for test
int main()
{
const int N = 7;
int a[N];
int b[N] = {0};
int n = 3;
for (int i = 0; i < N; ++i)
a[i] = i+1;
for (int i = 0; i < n; ++i)
b[N-1-i] = 1;
do
{
for (int i = 0; i < N; ++i)
if (b[i] == 1)
printf ("%d", a[i]);
printf ("/n");
}
while (prev_combination_count (b, b+N));

system ("pause");
}

• 本文已收录于以下专栏：

举报原因： 您举报文章：计数法的组合的算法 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)