有一个不是最佳算法的办法:
作一个递归函数,传入总和和数组(最好作成一个包含位置指针的结构数组),然后对数组的每个值进行循环,循环内,先计算总和减该值的结果:如果>0则调用该函数,参数为总和减该值的结果和不包含该值的数组,如果返回true则记录该值的位置指针,否则返回false;如果=0则返回true,并记录该值的位置指针;如果<0则返回false;
作一个递归函数,传入总和和数组(最好作成一个包含位置指针的结构数组),然后对数组的每个值进行循环,循环内,先计算总和减该值的结果:如果>0则调用该函数,参数为总和减该值的结果和不包含该值的数组,如果返回true则记录该值的位置指针,否则返回false;如果=0则返回true,并记录该值的位置指针;如果<0则返回false;
解决方案 »
- delphi 客户端执行存储过程
- with do 里创建的TstringList 怎么表示自身呢。
- 读出xml然后写入数据库的问题
- 【推荐】对P2P音视频通讯程序感兴趣的朋友和在这方面有经验的大虾请进来!
- DELPHI编译时为何报错呢?
- 怎末做帮助文件 ?
- 怎样删除MDAC2.7(in win2000)?大家都不懂,还是不想回答,特急,重装MDAC2.6SP1不行!!!!!
- 在没有装delphi的机子上运行编译后的exe
- 500分请教!!高手请进!关于WINDOWS消息及WIN API函数的问题?在线等待!急!!!!!!!
- delphi6,ShowWindow(handle,SW_HIDE)怎么无效????奇怪呀!
- 如何循环获知控件?
- 奉送50分,请问谁知道Delphi中给StringGrid中的Cell添加图片?
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;