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