子集Sum TI基本编程

时间:2009-12-29 03:53:35

标签: loops dynamic subset-sum ti-basic

我正在尝试对TI-83进行编程以进行子集求和搜索。因此,给定一个长度为N的列表,我想找到给定长度为L的所有列表,即给定值V的总和。

这与常规子集求和问题略有不同,因为我只搜索给定长度的子集,而不是所有长度,并且递归不一定是第一选择,因为我无法调用我正在工作的程序英寸

我可以使用嵌套循环轻松完成任务,但是对于大于5的L值,这变得很麻烦。我正在尝试使用动态解决方案,但我没有到达任何地方。

真的,在这一点上,我只是想让列表引用正确,这就是我正在看的东西。我们来举个例子:

L1={p,q,r,s,t,u}

所以

N=6

让我们查找长度为3的所有子集以使其保持相对较短,因此L = 3(6c3 =总输出为20)。

理想情况下,要搜索的列表引用是:

{1,2,3}
{1,2,4}
{1,2,5}
{1,2,6}
{1,3,4}
{1,3,5}
{1,3,6}
{1,4,5}
{1,4,6}
{1,5,6}
{2,3,4}
{2,3,5}
{2,3,6}
{2,4,5}
{2,4,6}
{2,5,6}
{3,4,5}
{3,4,6}
{3,5,6}
{4,5,6}

显然是通过以下方式完成的:

FOR A,1,N-2
    FOR B,A+1,N-1
        FOR C,B+1,N
            display {A,B,C}
        END
    END
END

我最初对N下降的数据进行排序,这允许我搜索缩短搜索的标准,并且当我在循环内增加A,B和C的值时,使用FOR循环将其在不同位置拧紧一点。

我也在寻找更好的动态解决方案。我已经在网上做了一些研究,但我似乎无法适应我的特殊情况。

任何帮助将不胜感激。我试图保持简短,不写小说,但解释我想要达到的目的。我可以根据需要提供更多细节。

1 个答案:

答案 0 :(得分:1)

为了优化,你只想跳过那些你现在已经超过值V的搜索子树。递归是要走的路,但是,因为你已经排除了这个,你就是最好设置允许深度的上限。

我会选择这样的东西(深度为3):

N is the total number of array elements.
L is the desired length (3).
V is the desired sum
Y[] is the array
Z is the total

Z = 0
IF Z <= V
  FOR A,1,N-L
    Z = Z + Y[A]
    IF Z <= V
      FOR B,A+1,N-L+1
        Z = Z + Y[B]
        IF Z <= V
          FOR C,B+1,N-L+2
            Z = Z + Y[C]
            IF Z = V
              DISPLAY {A,B,C}
            END
            Z = Z - Y[C]
          END
        END
        Z = Z - Y[B]
      END
    END
    Z = Z - Y[A]
  END
END

现在这很复杂,但它基本上在每个阶段检查你是否已经超过了所需的值并且拒绝检查较低的子树作为效率测量。它还保持当前级别的运行总计,以便在较低级别检查时不必执行大量添加。这是对Z的数组值的加法和减法。

当您修改它以处理更深度时(通过将DK的变量用于11个级别(如果您使用的话更多),它会更复杂更多愿意将NL移至WX,或者TI BASIC允许变量名中包含多个字符。)

我能想到的唯一其他非递归方式是使用值组数组来模拟迭代的递归,并且只会看起来略微少毛(虽然代码应该少嵌套)。