有一个不是最佳算法的办法:
作一个递归函数,传入总和和数组(最好作成一个包含位置指针的结构数组),然后对数组的每个值进行循环,循环内,先计算总和减该值的结果:如果>0则调用该函数,参数为总和减该值的结果和不包含该值的数组,如果返回true则记录该值的位置指针,否则返回false;如果=0则返回true,并记录该值的位置指针;如果<0则返回false;

解决方案 »

  1.   

    zswang(伴水)(* 嘻 *) :你用的什么算法?
      

  2.   

    const
      cScaleChar = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';function IntPower(mBase, mExponent: Integer): Integer;
    var
      I: Integer;
    begin
      Result := 1;
      for I := 1 to mExponent do Result := Result * mBase;
    end; { IntPower }function IntToDigit(mNumber: Integer; mScale: Byte;
      mLength: Integer = 0): string;
    { 返回整数的进制表示;mScale指定多少进制;mLength指定长度,长度不足时向前补0 }
    var
      I, J: Integer;
    begin
      Result := '';
      I := mNumber;
      while (I >= mScale) and (mScale > 1) do begin
        J := I mod mScale;
        I := I div mScale;
        Result := cScaleChar[J + 1] + Result;
      end;
      Result := cScaleChar[I + 1] + Result;
      for I := 1 to mLength - Length(Result) do Result := '0' + Result;
    end; { IntToDigit }function Calc(mNumber: Real; mSource: TStrings; mDesc: TStrings): Boolean;
    label
      Loop;
    var
      I, J: Integer;
      T, S: string;
      vNumber: Real;
    begin
      Result := False;
      if not (Assigned(mSource) and Assigned(mDesc)) then Exit;
      mDesc.Clear;
      for I := 0 to IntPower(2, mSource.Count) - 1 do begin
        T := IntToDigit(I, 2, mSource.Count);
        vNumber := 0;
        for J := 1 to Length(T) do
          if T[J] = '1' then begin
            vNumber := vNumber + StrToFloatDef(mSource[J - 1], 0);
            if vNumber > mNumber then goto Loop;
          end;
        if Abs(vNumber - mNumber) <= 0.1 then begin
          S := '';
          for J := 1 to Length(T) do
            if T[J] = '1' then
              S := S + '+' + mSource[J - 1];
          Delete(S, 1, 1);
          mDesc.Add(S);
        end;
        Loop: ;
      end;
      Result := True;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      Edit1.Text := StringReplace(Edit1.Text, ' ', '', [rfReplaceAll]);
      Edit1.Text := StringReplace(Edit1.Text, '$', '', [rfReplaceAll]);
      Edit1.Text := StringReplace(Edit1.Text, ',', '', [rfReplaceAll]);
      Memo1.Text := StringReplace(Memo1.Text, ' ', '', [rfReplaceAll]);
      Memo1.Text := StringReplace(Memo1.Text, '$', '', [rfReplaceAll]);
      Memo1.Text := StringReplace(Memo1.Text, ',', '', [rfReplaceAll]);
      Calc(StrToFloatDef(Edit1.Text, 0), Memo1.Lines, Memo2.Lines);
    end;