这个函数的功能是:有一个数据表,表中有一列为数值型,并且按值从大到小顺序排列。现在的目的是从这个表中取出最少条数据,使这些数据的和相加等于一个指定的值。我写了以下函数,测试了下,没有问题,感觉又有点问题,但自己又找不到原因,只是感觉而已。贴出来,请大家看看。说明:
1、我现在用的是内存表测试的
2、如果大家有更好的方法,麻烦贴出来function TForm1.doit(s: Integer): Boolean;
var
Len: Integer;
SearchValue: Integer;
begin
Result := False;
SearchValue := s;
//先查找有没有等于 S 的数据
if JG.Locate('PRRS', SearchValue, []) then
begin
Memo1.Lines.Add('找到了==' + IntToStr(JG.FieldByName('prrs').AsInteger));
Result := True;
Exit;
end
else
begin
//先过滤小于S的数据
JG.Filtered := False;
JG.Filter := 'PRRS<' + IntToStr(SearchValue);
JG.Filtered := True;
//再按照最大到小顺序排序
JG.SortOn('PRRS', [mtcoDescending]);
JG.First;
Memo1.Lines.Add('==' + IntToStr(JG.FieldByName('prrs').AsInteger));
//再用S-第一个最大的值
SearchValue := SearchValue - JG.FieldByName('prrs').AsInteger;
if not JG.Eof then
begin
JG.Delete;
Result := doit(SearchValue);
end;
end;
end;
1、我现在用的是内存表测试的
2、如果大家有更好的方法,麻烦贴出来function TForm1.doit(s: Integer): Boolean;
var
Len: Integer;
SearchValue: Integer;
begin
Result := False;
SearchValue := s;
//先查找有没有等于 S 的数据
if JG.Locate('PRRS', SearchValue, []) then
begin
Memo1.Lines.Add('找到了==' + IntToStr(JG.FieldByName('prrs').AsInteger));
Result := True;
Exit;
end
else
begin
//先过滤小于S的数据
JG.Filtered := False;
JG.Filter := 'PRRS<' + IntToStr(SearchValue);
JG.Filtered := True;
//再按照最大到小顺序排序
JG.SortOn('PRRS', [mtcoDescending]);
JG.First;
Memo1.Lines.Add('==' + IntToStr(JG.FieldByName('prrs').AsInteger));
//再用S-第一个最大的值
SearchValue := SearchValue - JG.FieldByName('prrs').AsInteger;
if not JG.Eof then
begin
JG.Delete;
Result := doit(SearchValue);
end;
end;
end;
解决方案 »
- Dll返回DataSet数据集合问题!老提示invalid pointer operation
- delphi图像里的随机问题
- 自动编号问题
- 帮一下忙,关于动态链接库的问题
- 如何将C++Builder中编写的组件安装到Delphi中?
- 急!!关于D7中的Indy控件问题
- TdbEdit连接的是一个时间类型的字段,当输入的字符不合法时,程序就会瘫痪,如何让程序给出我的提示,并继续运行,如提示用户‘请检查你
- 帮忙找些资料
- 怎样用程序把Sql Sever一个表中的部分数据备份成数据文件??
- 新版的MCLIUB可以下载了!!!
- 关于OLE数据传输时,报存“储空间不足...”的问题?
- 这究竟是不是数组的指针
我说的有序是一个数n 它的前一个是n-1 后一个是n+1你的这个函数就可以了,一直递推下去就行了
不过有可能找到最后一个数,累加起来也不等于所找的值