0
procedure solve(liko_skaitmenu, rezultatas : integer);
    var i, j : integer; 
begin
    if (not baigti) and (liko_skaitmenu = 0) and (rezultatas = b) then
        begin
            for j := 1 to c do
                WriteLn(ats[j]);
            baigti := true;
        end

        else 
            for i := 1 to N do
            begin
                ats[liko_skaitmenu] := i;
                solve(liko_skaitmenu-1,rezultatas + a[i]);
            end; 
end;

所以我收到范围超限错误,我看不到我真正超出范围的地方。我试图用这个函数做的是尝试在等于 b 的 N 长度数组中找到 c 元素的总和。请帮我。

4

2 回答 2

1
if (not baigti) and (liko_skaitmenu = 0) and (rezultatas = b) then

当 liko_skatimenu 为 0 时,这有可能评估为 false,因为评估的结果也取决于 rezultatas 和 baigti。如果下次继续,您将拥有 ats[-1] := i;,这可能不是您想要的。我会将其更改为:

if (liko_skaitmenu = 0) or ((not baigti) and (rezultatas = b)) then
于 2011-01-26T18:43:59.660 回答
0

这些代码使用了几个难以理解的全局变量,并且您没有显示在调用过程之前如何初始化变量。如果代码示例是英文的,这也会有所帮助。

反正,

  1. 代码没有防范rezultatas > b.
  2. 由于 上的复杂条件ifats[liko_skaitmenu] := i;可以使用 的值执行liko_skaitmenu < 1
  3. 该代码不能防止重复相同的数字/索引位置。

您可能想要更多类似的东西:

if not baigti and (resultatas <= b) then (* if not told to stop, or off-range *)
begin
    if liko_skaitemu = 0 then
    begin
        (* finished searching: either success or failure *)
        if resultatas = b then
           (*success! save the values *)
           baigti := true;
        end;
    end
    else
    begin
       (* continue searching *)
    end
end;

也就是说,方法是 O(N^c)。您可以通过对数组进行排序并将递归步骤限制为可以保存答案的数组部分来做得更好,或者您可以使用数组中 c 数字的组合。这个论坛有很多类似的问题都有很好的答案。

于 2011-01-26T19:13:54.517 回答