计数法的组合的算法

原创 2004年08月17日 19:53:00

// 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>
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");
}

算法训练 JAM计数法

问题描述   Jam是个喜欢标新立异的科学怪人。他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩。在他的计数法中,每个数字的位数都是相同的(使用相同个数的字母),...
  • github_33890270
  • github_33890270
  • 2016-05-09 00:43:26
  • 743

分形维数计算方法 一种盒计数方法

  • 2010年10月29日 20:14
  • 818B
  • 下载

java 对象存活分析——引用计数法&可达性分析

java虚拟机总共分为五个区域,其中三个是线程私有:程序计数器,虚拟机栈,本地方法栈,两个是线程共享:堆,方法区。线程私有的区域等到线程结束时(栈帧出栈时)会自动被释放,空间比较容易清理。而线程共享的...
  • QuinnNorris
  • QuinnNorris
  • 2017-07-13 09:36:04
  • 2633

算法:键索引计数法

一、思想  适用于小整数键的简单排序方法;假设数组a[]中的每个元素都保存了一个名字和一个组号,其中组号在0到R-1之间,以组号为键进行分组排序;    二、步骤  频率统计:...
  • p106786860
  • p106786860
  • 2014-01-12 09:36:34
  • 2532

引用计数法的循环引用问题

转载地址:http://thatmonkey.blog.51cto.com/7935609/1384463 关于引用计数法,我们可以先看一段wiki上的描述: As a c...
  • u010032372
  • u010032372
  • 2016-01-18 11:13:27
  • 1526

2006(3)JAM的计数法

背景 noip2006普及第3题. 描述 Jam是个喜欢标新立异的科学怪人。他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩。在他的计数法中,每个数字的...
  • qq_36037845
  • qq_36037845
  • 2016-09-06 15:05:59
  • 459

GC_3_引用计数法

3 引用计数法   GC是一种,释放怎么都无法被引用的对象的机制。可以让所有对象事先记录下有多少程序引用自己,让各对象知道自己的人气指数,从而让没有人气的对象自己消失,这就是引用计数法(Refere...
  • u014228375
  • u014228375
  • 2017-04-03 10:28:55
  • 399

算法系列—低位优先的字符串排序(基于键索引计数法)

原理日后有空补上。今天该回宿舍了- - 此版本可实现相同长度的字符串数组,不同长度稍加改动即可。 C++代码如下: #include #include using namespace std;...
  • candy_xiaolei
  • candy_xiaolei
  • 2017-01-13 23:30:58
  • 395

Jam的计数法(C++)

题目描述 Jam是个喜欢标新立异的科学怪人。他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩。在他的计数法中,每个数字的位数都是相同的(使用相同个数的字母),英文...
  • xingyyn78
  • xingyyn78
  • 2016-07-02 17:10:13
  • 298

求最大公约数的算法分析及实验报告

算法设计与分析 实验报告书   实验名称:   求两个自然数m和n的最大公约数                                                        ...
  • j2013210855
  • j2013210855
  • 2015-04-12 18:45:10
  • 1256
收藏助手
不良信息举报
您举报文章:计数法的组合的算法
举报原因:
原因补充:

(最多只允许输入30个字)