我得到了X个长度为Y的二进制数,想看看它们是否加在一个特定的和K上。
我对子集和问题的动态解做了一些研究;但是,我认为这个特定的问题有一个转折点。
将两个长度为y的二进制数相加,并将总和的长度限制为y,有时会从总和中减去2^(y)(如果存在溢出)。由于添加两个二进制数有时会导致溢出,例如添加:

10000000000000000000000000000000000000010
10000000000000000000000000000000000000010

将产生总额
00000000000000000000000000000000000000100

因此,在某些情况下,增加数字实际上会降低当前总和。
此刻,我正把头撞在墙上有什么技巧或指示如何攻击这个特定版本的子集和问题吗?
更新:
我能用的东西没有真正的限制。我唯一的目标是用长度为40的50个二进制数产生尽可能快的运行时

最佳答案

你可以使用中间相遇的技巧。
将初始数组分成两半(如果总共有50个数字,则为25个数字)。
对于每一半,生成所有可能的子集和(需要O(2^n)O(2^n * n)时间)对于n = 25n是一半的大小)应该是可行的。
对于前半部分的每个可能和,使用哈希表检查下半部分是否有适当的和(使用A + B = target (mod M)表示B = target - A (mod M))。

10-02 09:37