-1

我在 wiki http://en.wikipedia.org/wiki/Subset_sum_problem#Pseudo-polynomial_time_dynamic_programming_solution上阅读了关于 sumsubsetproblem 的内容,并想知道我是否可以将其调整为以下问题:

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

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

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

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

问候

短剑

4

1 回答 1

0

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

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

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

于 2013-09-19T04:34:08.873 回答