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