Algorithm 两个有限制集的伪多项式时间动态规划子集

Algorithm 两个有限制集的伪多项式时间动态规划子集,algorithm,polynomial-math,subset-sum,Algorithm,Polynomial Math,Subset Sum,我在维基上读到过关于sumsubsetproblem的文章,我想知道我是否可以将其应用于以下问题: 我需要所有可能的子集ss1,ss2,由n1限制,n2是2个集合s1,s2中的元素数 如果大小为n1和n2的子集的和等于0,我将使用S1的元素作为正元素,s2的元素作为负元素来回答这个问题 我在这里的特殊问题是集合本身可以包含0,我想我可以通过将这些元素分别设置为1或-1来解决这个问题(1不是我输入的成员,它将是(0,10,50100200500)),下一个问题是这个算法只给我是或否,但我已经知道这

我在维基上读到过关于sumsubsetproblem的文章,我想知道我是否可以将其应用于以下问题:

我需要所有可能的子集ss1,ss2,由n1限制,n2是2个集合s1,s2中的元素数

如果大小为n1和n2的子集的和等于0,我将使用S1的元素作为正元素,s2的元素作为负元素来回答这个问题

我在这里的特殊问题是集合本身可以包含0,我想我可以通过将这些元素分别设置为1或-1来解决这个问题(1不是我输入的成员,它将是(0,10,50100200500)),下一个问题是这个算法只给我是或否,但我已经知道这个答案(这是一个先决条件)我需要的是结果

这还够快吗?我在这里读到了一个perl实现,OP发布了一个包含30个元素的运行时列表,计算时间为30-40秒,这对于我的需要来说太慢了,我需要用java实现,据我所知,这比perl还要慢

问候


德克

依次考虑S1和S2。与子集求和问题一样,您可以创建一个数组,通过将S1(和S2类似)的元素的任何可能子集相加,来告诉您可以计算哪些数字。您可以保留一个额外的标志,告诉您是否可以通过将S1的一个或多个元素相加(S2也是如此)来获得结果零

现在,您需要做的就是遍历两个数组的结果,试图找到两个加起来等于零的数字,并找出是否同时设置了两个零标志

我不知道这需要多长时间,但我希望桌面上的JVM比Perl快,因为桌面上的JVM有即时编译器。我希望生成每个可能和数组的时间随着集合的大小乘以可能和的数量而增加,这将与最大可能和的大小大致相同,除非集合中的数字非常不同