如何实现一个数组所有的组合????

比如一个数组(1,2,3),如何实现所有的排列组合,如下所示: 
(1) 
(2) 
(3) 
(1,2) 
(1,3) 
(2,3) 
(1,2,3)

Delphi/Pascal code
function TestBit(Value, Index : integer) : Boolean;
asm
BT EAX, EDX
SBB EAX, EAX
AND EAX, 1
end;

procedure TForm1.Button1Click(Sender: TObject);
const
A : array[0..4] of Char = (‘A‘,‘B‘,‘C‘,‘D‘,‘E‘);
var
I, J: Integer;
Temp: string;
begin
for I := 1 to 31 do begin
Temp := ‘‘;
for J := Low(A) to High(A) do
if TestBit(I, J) then Temp := Temp + A[J];
Memo1.Lines.Add(Temp);
end;
end;

说一下一楼算法的思路,以免楼主看不懂(这个算法不是递归算法):

首先,把数组每一个元素用一个二进位表示,例如:

A B C D E
1 1 1 1 1 ---> 于是它最多有11111(二进制)种不重复组合(即31种)(不考虑顺序--按楼主要求)

于是,只要检查从1到31这些数字的二进位哪些是二进制值1,就可以得出组合了。(位值为1的元素选取,位值为0的元素弃之)

函数TestBit是我以前写的一个小函数,用于检查某整型数某二进位值,如果该位为1返回True。这个函数从来没有用到过,用在这里了。

^_^

一个回溯算法的例子:

Delphi/Pascal code

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

procedure TForm1.Calc(M : array of Integer);

var

  N : Integer;

  A : array of Integer;

  i , p: Integer;

  X : Integer;

  S : String;

begin

  N := Length(M);

  SetLength(A, N);

  for X := 0 to N - 1 do

  begin

    for i := 0 to N - 1 do A[i] := -1;

    p := 0;

    while p >= 0 do

    begin

      if A[p] = -1 then

      begin

        if p = 0 then

          A[p] := 0

        else

          A[p] := A[p - 1] + 1;

      end

      else

        inc(A[p]);

      if A[p] >= N then

      begin

        A[p] := -1;

        dec(p);

      end

      else begin

        inc (p);

        if p > X then

        begin

          S := ‘‘;

          for i := 0 to do

          begin

            if s <> ‘‘ then s := S + ‘,‘;

            S := S + IntToStr(M[A[i]]);

          end;

          memo1.Lines.Add(S);

          dec(p);

        end;

      end;

    end;

  end;

end;

procedure TForm1.Button1Click(Sender: TObject);

const

  M : array [0..3of Integer = (1234);

begin

  Calc(M);

end;

时间: 2024-07-30 10:08:26

如何实现一个数组所有的组合????的相关文章

一道小题:从一个数组里产生所有可能的乘积组合

比如给定一个数组[2,3,11] 要求产生[1,2,3,6,11,22,33,66] 观察可得:[2,3] 产生了[1,2,3,6] 的乘积可能.当加入11时,11会和现有的每一个元素都相乘得到[1,2,3,6,11,22,33,66] public static void allProducts(int[] arr) { List<Integer> list = new ArrayList<Integer>(); list.add(1); for(int i=0; i<ar

C# 委托:把方法组合到一个数组中使用

C# 委托:把方法组合到一个数组中使用 2016年04月28日 16:12:55 kernel_main 阅读数 1129 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class MathOperations { public static double MultiplyByTwo(double value

js多个(N)个数组的的元素组合排序算法,多维数组的排列组合或多个数组之间的排列组合

现在有一批手机,其中颜色有['白色','黑色','金色','粉红色']:内存大小有['16G','32G','64G','128G'],版本有['移动','联通','电信'],要求写一个算法,实现[['白色','16G','移动'], ['白色','16G','联通'] ...]这样的组合,扩张,如果后面还有参数,比如再加一个['国行','港版','美版'],不改程序一样可以执行! 通过上面规律可以发现这个算法就是:一个数组里面包含若干个数组,进行组合 算法代码写法一: // 执行组合排列的函数

求一个数组的最大k个数(java)

问题描述:求一个数组的最大k个数,如,{1,5,8,9,11,2,3}的最大三个数应该是,8,9,11 问题分析: 1.解法一:最直观的做法是将数组从大到小排序,然后选出其中最大的K个数,但是这样的解法,复杂度是O(logn*n),但是有时候并不需要排序,用简单的选择排序,或者是冒泡排序,那么就K轮的交换或者是选择,就可以得出结论,复杂度是O(n*k),当K很大的时候排序可能是更好的解法,当K小的时候用选择或者是冒泡效率会更加的高.但是这都是会对前K个数进行排序,所以效率不高,当K很大的时候,以

找出数组中所有组合中最大的值

面试中,经常有算法题: 比如找出一个数组中的所有组合,并找出最大的值. 代码如下: 1 package com.company.algorithm; 2 3 /** 4 * 选择数组中和的值最大的一组,例如:[2,-7,5,-9],组大的一组是:2,-7,5值为0 5 */ 6 public class SelectValueMaxGroup { 7 public static void main(String[] args) { 8 int[] list = {6, -1, 2, -9, 4,

C++_第七章函数的基本知识_求阶乘的子函数_ 函数参数类型为数组_ 求数组内所有元素和、部分元素和的方法_实现了先从键盘输入到一个数组中,再用for循环取读出数组中的元素 for循环也可以用break来结束循环的

/* 第七章函数的基本知识 */ /*01)c++对于返回值有一定的限制:可以是常量.变量.指针.结构对象或表达式,但不可以是数组02)c++返回数组的方法:将数组作为结构会对象组成部分来返回03)函数遇到return则结束该函数04)如果一个函数的两房额参数类型相同,则必须分别制定每个参数的类型,而不能像声明常规变量那样,将声明组合在一起05)*/ //本代码注意double类型的写法以及double和int类型数据的转换 1 #include <iostream> 2 3 void che

java实现求一个数组里最大值和最小值之前缺省的数的算法

问题描述: 求一个数组里最大值和最小值之间缺省的数,例如 int arrDemo = {1, 3, 7};  那么就要输出最小值1和最大值7之间缺少的数字2,4,5,6 代码如下,有更好的思路欢迎大家在评论区留言讨论 1 package test; 2 3 public class Test { 4 5 static int[] array = { 6 -10,0,3,3,9 7 }; 8 9 private static void printEmptyItems(int[] array) {

如何在linux Shell脚本里面把一个数组传递到awk内部进行处理

前段时间和几位同事讨论过一个问题:Shell脚本里面怎样把一个数组传递到awk内部进行处理? 当时没有找到方法.前两天在QQ群里讨论awk的时候,无意间又聊起这个话题.机缘巧合之下找到一个思路,特此分享. 测试环境: [root]# head -1 /etc/redhat-release Red Hat Enterprise Linux Server release 6.5 (Santiago) [root]# awk --version | head -1 GNU Awk 3.1.7 众所周知

程序员面试100题之十:快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值(转)

能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解. 假如有如下的两个数组,如图所示: 5,6,1,4,7,9,8 给定Sum= 10 1,5,6,7,8,9 给定Sum= 10 分析与解法 这个题目不是很难,也很容易理解.但是要得出高效率的解法,还是需要一番思考的. 解法一 一个直接的解法就是穷举:从数组中任意取出两个数字,计算两者之和是否为给定的数字. 显然其时间复杂度为N(N-1)/2即O(N^2).这个算法很简