谢谢,请大家帮我看看这个函数有没有写正确!

cqnucsmoon 2011-12-08 03:14:13
这个函数的功能是:有一个数据表,表中有一列为数值型,并且按值从大到小顺序排列。现在的目的是从这个表中取出最少条数据,使这些数据的和相加等于一个指定的值。我写了以下函数,测试了下,没有问题,感觉又有点问题,但自己又找不到原因,只是感觉而已。贴出来,请大家看看。

说明:
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;
...全文
90 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
cqnucsmoon 2011-12-08
  • 打赏
  • 举报
回复
这个是有可能的,如果没有适合的数字,是有可能累加都找不到指定的值。
kaikai_kk 2011-12-08
  • 打赏
  • 举报
回复
有重复,就不是有序了
我说的有序是一个数n 它的前一个是n-1 后一个是n+1

你的这个函数就可以了,一直递推下去就行了
不过有可能找到最后一个数,累加起来也不等于所找的值
cqnucsmoon 2011-12-08
  • 打赏
  • 举报
回复
如果有重复值的话,就找第一个。
cqnucsmoon 2011-12-08
  • 打赏
  • 举报
回复
有序的,是从大到小,并且值有重复的
比如:

8
6
6
4
4
3
1
kaikai_kk 2011-12-08
  • 打赏
  • 举报
回复
值有序吗?
比如
2
3
6
8

找12

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧