子集和二进制数

时间:2014-12-26 19:04:53

标签: algorithm binary dynamic-programming subset subset-sum

我得到了长度为Y的X二进制数,想看看它们是否加起来是一个特定的和。

我做了一些关于子集和问题的动态解决方案的研究;但是,我认为这个具体问题是一个转折点。

添加两个长度为Y的二进制数并将和的长度限制为Y有时会从总和中减去2 ^(Y)(如果有溢出)。由于添加两个二进制数有时会导致溢出,例如添加:

10000000000000000000000000000000000000010
10000000000000000000000000000000000000010

将产生总和

00000000000000000000000000000000000000100

因此,在某些情况下,添加数字实际上会降低当前总和。

此刻,我正在把头撞到墙上。任何提示或指针如何攻击这个特定版本的子集求和问题?

更新:

我可以使用的内容没有实际限制。我唯一的目标是用~50个二进制数〜{40

来产生最快的运行时间

1 个答案:

答案 0 :(得分:2)

您可以使用中间相遇技术。

  1. 将您的初始数组拆分为两半(如果共有50个数字,则包含25个数字)。

  2. 对于每一半,生成所有可能的子集和(它需要O(2^n)O(2^n * n)时间。它应该适用于n = 25n的大小为一半)。

  3. 对于上半年的每个可能的总和,使用哈希表检查下半部分是否有适当的总和(使用A + B = target (mod M)表示B = target - A (mod M)的事实)。