我得到了长度为Y的X二进制数,想看看它们是否加起来是一个特定的和。
我做了一些关于子集和问题的动态解决方案的研究;但是,我认为这个具体问题是一个转折点。
添加两个长度为Y的二进制数并将和的长度限制为Y有时会从总和中减去2 ^(Y)(如果有溢出)。由于添加两个二进制数有时会导致溢出,例如添加:
10000000000000000000000000000000000000010
10000000000000000000000000000000000000010
将产生总和
00000000000000000000000000000000000000100
因此,在某些情况下,添加数字实际上会降低当前总和。
此刻,我正在把头撞到墙上。任何提示或指针如何攻击这个特定版本的子集求和问题?
更新:
我可以使用的内容没有实际限制。我唯一的目标是用~50个二进制数〜{40
来产生最快的运行时间答案 0 :(得分:2)
您可以使用中间相遇技术。
将您的初始数组拆分为两半(如果共有50个数字,则包含25个数字)。
对于每一半,生成所有可能的子集和(它需要O(2^n)
或O(2^n * n)
时间。它应该适用于n = 25
(n
的大小为一半)。
对于上半年的每个可能的总和,使用哈希表检查下半部分是否有适当的总和(使用A + B = target (mod M)
表示B = target - A (mod M)
的事实)。