计数法的组合的算法

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

排列组合和回溯算法-面试题

排列组合和回溯算法的面试题
  • sunxianghuang
  • sunxianghuang
  • 2016年07月13日 15:02
  • 1887

Js 对小数的处理(科学计数法 , 显示精度)

对数字进行格式化输出,是非常有意义的一件事情,例如许多时候,我们希望一个数字能够输出为指定格式的字符串,拿25.9878来说,我们可能会希望它能保留两位小数来说出,即结果为25.99,或者对于0.34...
  • ole_triangle_java
  • ole_triangle_java
  • 2017年01月12日 10:00
  • 503

排序算法——计数排序

之前看的都是比较排序算法,通过两个数大小的比较来进行比较。计数排序是一种线性排序算法,不用进行比较。基本思想是对于每个元素x,找出比x小的数的个数,从而确定x在排好序的数组中的位置。算法导论第三版10...
  • fynjy
  • fynjy
  • 2015年07月01日 21:43
  • 2051

简单编程(二十一)计数排序法

实现如下的排序算法:有一种简单的排序方法叫计数排序法,这种排序算法对一个待排序的数组进行排序,并将排序结果放到另一个新的数组中。计数排序算法针对待排序数组中的每个数据,扫描待排序的数组一趟,统计待排序...
  • zzc1510334836
  • zzc1510334836
  • 2014年12月16日 16:34
  • 935

【每日算法】计数&基数&桶&位图排序-简介

在前面的文章中,我们介绍的都是基于比较的排序。对于比较排序,对含n个元素的序列进行排序,在最坏情况下都要用O(n logn)次比较(归并排序和堆排序是渐近最优的)。本文将继续介绍以线性时间运行的排序算...
  • jiange_zh
  • jiange_zh
  • 2016年02月20日 12:48
  • 1416

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

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

回溯法解决排列组合问题

package 算法和数据结构; /** * Filename : Backtracking.java * Author : zhihao_tian@126.com * Creation time :...
  • sdu_bupt
  • sdu_bupt
  • 2017年05月09日 23:18
  • 328

JS科学计数法初探

关于科学计数法转换算法的探索
  • jingwang2016
  • jingwang2016
  • 2016年12月07日 14:54
  • 275

群论及Polya计数定理题目入门

.
  • xym_CSDN
  • xym_CSDN
  • 2016年12月24日 17:05
  • 1442

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

转载地址:http://thatmonkey.blog.51cto.com/7935609/1384463 关于引用计数法,我们可以先看一段wiki上的描述: As a c...
  • u010032372
  • u010032372
  • 2016年01月18日 11:13
  • 1273
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:计数法的组合的算法
举报原因:
原因补充:

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