Algorithm 二元数子集和

Algorithm 二元数子集和,algorithm,binary,dynamic-programming,subset,subset-sum,Algorithm,Binary,Dynamic Programming,Subset,Subset Sum,我得到了长度为Y的X个二进制数,想看看它们加起来是否等于一个特定的和K 我研究了子集和问题的动态解;然而,我认为这一具体问题出现了扭曲 将两个长度为Y的二进制数相加并将总和的长度限制为Y,有时会从总和中减去2^(Y)(如果存在溢出)。因为添加两个二进制数有时会导致溢出,例如添加: 10000000000000000000000000000000000000010 10000000000000000000000000000000000000010 将产生总数 000000000000000000

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

我研究了子集和问题的动态解;然而,我认为这一具体问题出现了扭曲

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

10000000000000000000000000000000000000010
10000000000000000000000000000000000000010
将产生总数

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

此刻,我正把头撞到墙上。有没有关于如何解决这个特定版本的子集和问题的提示或指针

更新:


我可以使用的东西没有真正的限制。我唯一的目标是用50个长度为40的二进制数生成尽可能快的运行时,您可以使用中间相遇技术

  • 将初始数组拆分为两半(如果总共有50个数字,则使用25个数字)

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

  • 对于前半部分的每个可能总和,使用哈希表检查后半部分是否有适当的总和(使用
    A+B=target(mod M)
    表示
    B=target-A(mod M)


  • 为什么数字的表达方式很重要?你所拥有的仍然是子集和问题的某个版本。那么,这里有哪些额外的约束可以使它更快地求解?你可以有多少个数字?据我所知,这不重要,模2的幂的整数是a而不是a,但我所知道的子集和算法都不依赖于乘法逆的存在。使用模2^(Y+1)不会破坏标准的动态规划算法?不,但它需要长度为2^Y的数组(顺便说一句,它不是模2^Y吗?)你是对的,它是2^Y。但是,在我的平均运行情况下,当Y=~40时,长度为2^Y的数组似乎是极端的。这是唯一的解决方案吗?这不会导致O(n^2)解决方案也需要O(n^2)内存吗?也许这是唯一的方法,但它与原始解决方案相比并没有大的进步(只需在O(n^2)时间内生成所有可能的子集)。@RasmusJ它是
    O(2^(n/2))
    时间和内存。它比
    O(2^n)
    好得多。