具有局限性的两组伪多项式时间动态规划子集

时间:2013-09-18 19:39:42

标签: algorithm polynomial-math subset-sum

我在wiki http://en.wikipedia.org/wiki/Subset_sum_problem#Pseudo-polynomial_time_dynamic_programming_solution上读到了有关sumsubset问题的信息,并想知道我是否可以将其改编为以下问题:

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

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

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

这还够快吗?我在这里读到了一个perl实现,其中OP发布了一个包含运行时的列表,30个元素的计算时间为30-40秒,这对我的需求来说太慢了,我需要在java中实现,到目前为止因为我知道甚至比perl更慢

问候

德克

1 个答案:

答案 0 :(得分:0)

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

现在您需要做的就是查看两个数组的结果,试图找到两个加起来为零的数字,并找出是否设置了两个零标志。

我不知道这需要多长时间,但我希望桌面上的JVM比Perl更快,因为台式机上的JVM具有Just-In-Time编译器。我希望生成每个可能总和数组的时间随着设置的大小乘以可能总和的数量,这将与最大可能总和的大小大致相同,除非集合中的数字是非常不同。