起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 203|回复: 3

【搞定】代码编不过 帮忙看下**

[复制链接]
发表于 2007-2-28 17:31:21 | 显示全部楼层 |阅读模式
type
  IA=array of Integer;


function GenRandArray(MinNum,MaxNum,MinValue,MaxValue:Integer):IA;
var
  i,n:Integer;
begin
  Randomize;
  n:=MinNum+Random(MaxNum-MinNum+1);
  SetLength(Result,n);
  for i:=0 to n-1 do
    Result:=MinValue+Random(MaxValue-MinValue+1);
end;
function FindMaxSum(A:IA;Sum:Integer):Integer;
var
  MinLeft:Integer;
  Used:array of Boolean;
  procedure QuickSortIA(L, R: Integer); //从小到大排序
  var
    I, J, P, M: Integer;
  begin
    repeat
      I := L;
      J := R;
      P := (L + R) shr 1;
      repeat
        while A[I]<A[P] do Inc(I);
        while A[J]>A[P] do Dec(J);
        if I <= J then
        begin
          M:=A[I];
          A[I]:=A[J];
          A[J]:=M;
          if P = I then
            P := J
          else if P = J then
            P := I;
          Inc(I);
          Dec(J);
        end;
      until I > J;
      if L < J then QuickSortIA(L, J);
      L := I;
    until I >= R;
  end;
  procedure FindLeft(LeftSum,LeftCount:Integer);
  var
    i,n,s:Integer;
    Str:String;
  begin
    if (A[0]>LeftSum) or Used[0] then
    begin
      if LeftSum<MinLeft then
      begin
        MinLeft:=LeftSum;
        Str:='';
        s:=0;
        n:=0;
        for i:=0 to High(A) do
          if Used then
          begin
            Str:=Str+IntToStr(A)+' ';
            Inc(s,A);
            Inc(n);
          end;
        Str:=Str+#13#10+IntToStr(s);
        Form1.Memo1.Lines.Add(Str);
        Application.ProcessMessages;
        //如果已经达到理想和值,或者已经耗尽了所有元素——该结束了
        if (LeftSum=0) or (n>=High(A)) then
          Abort; //产生哑异常,让try..except捕获——最方便的跳出递归的方法
      end;
      exit;
    end;
    n:=LeftCount;
    while n>=0 do //寻找最高的起点
    begin
      if A[n]>LeftSum then
        Dec(n)
      else
        break;
    end;
    for i:=n downto 0 do //贪心算法——先大后小
    begin
      Used:=true;
      FindLeft(LeftSum-A,i-1); //确保以后取的值比现在小
      Used:=false;
    end;
  end;
begin
  QuickSortIA(0,High(A));
  SetLength(Used,High(A)+1);
  FillChar(Used[0],(High(A)+1)*SizeOf(Boolean),0);
  MinLeft:=Sum;
  try
    FindLeft(Sum,High(A));
  except
  end;
  Result:=Sum-MinLeft;
end;
回复

使用道具 举报

发表于 2007-3-1 11:41:54 | 显示全部楼层
function FindMaxSum(A:IA;Sum:Integer):Integer;
var
  MinLeft:Integer;
  Used:array of Boolean;
  procedure QuickSortIA(L, R: Integer); //从小到大排序

函数中嵌套函数不支持,把里面嵌套的函数放到外面来
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-3-6 11:38:44 | 显示全部楼层
晕死了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-3-6 11:39:23 | 显示全部楼层
好  谢谢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2024-12-26 08:39 , Processed in 0.047902 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表