A[n]是一个动态数组,float型。没有按照大小顺序排列,有重复值!
现想找出所有可能的组合求和等于指定值M。
返回所有组合的数组下标!
如果用递归的话,Delphi里面的程序完整代码怎么写~~谢谢咯!

解决方案 »

  1.   

    用for的话,最坏情况是有high(a)个变量,做high(a)个循环
      

  2.   

    只要数组A的元素个数不超过31个,不需要递归, 利用整数的位操作, 一个单循环就能遍历所有组合情况了。
    var
      A: array of Double;procedure TForm1.FindResult(M: Double);
    var
      N, i: Integer;
      j, k: Integer;
      S   : Double;
      R   : array of Boolean;
    begin
      SetLength(R, High(A) + 1);
      N := 1;
      for i := 0 to High(A) do N := N * 2;
      for i := 0 to N - 1 do
      begin
        k := i;
        for j := 0 to High(A) do
        begin
          R[j] := k mod 2 = 1;
          k := k div 2;
        end;
        S := 0;
        for j := 0 to High(A) do
          if R[j] then S := S + A[j];
        if abs(S - M) < 1E-16 then
        begin
          //输出结果
          Memo1.Lines.Add('========================');
          for j := 0 to High(A) do
            if R[j] then Memo1.Lines.Add(IntToStr(j));
        end;
      end;
      R := nil;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      SetLength(A, 5);
      A[0] := 1;
      A[1] := 3;
      A[2] := 4;
      A[3] := 6;
      A[4] := 8;
      FindResult(11);
    end;
      

  3.   


    FlagAry: array[0..0] of Integer;
    NumAry: array[0..4] of Integer = (1, 2, 3, 4, 5);procedure Portfolio(m, n, SearchNum: Integer);
    var
      I, J, Num: Integer;
      Str: string;
    begin
     for i := m downto n do
     begin
      FlagAry[n] := NumAry[i-1];
      if (n > 1) then
       Portfolio( i - 1, n - 1, SearchNum)
      else
      begin
       Num := 0;
       Str := '';
       for J := FlagAry[0] downto 1 do
       begin
         Str := Str + IntToStr(FlagAry[J]);
         Num := Num + FlagAry[J];
       end;   if Num = SearchNum then
         Form1.Memo1.Lines.Add(Str);
      end;
     end;
    end;调用
    procedure TForm1.Button1Click(Sender: TObject);
    var
      I: Integer;
    begin
      for I := 1 to Length(NumAry) do
      begin
        FlagAry[0] := i;
        Portfolio(5, FlagAry[0], 6);
      end;
    end;结果
    51
    42
    32141
    32
      

  4.   

    FlagAry: array[0..0] of Integer;
    这么写还是不太好,最大改成排列组合的组合数