【发布时间】:2012-01-22 08:32:32
【问题描述】:
我有几个这样的数字数组(数组的每个元素只能取0或1的值)
v1:1; 0; 0; 1个; 1个; v2:0; 1个; 0; 0; 1个; v3:1; 1个; 0; 1个; 0; v4:1; 0; 0; 1个; 0; v5:1; 1个; 0; 1个; 1个; v6:1; 1个; 0; 1个; 1个;我希望找到这样的子集,以便在对数组求和时,生成的数组具有单独的元素,这些元素是 2 的倍数。例如,v1+v2+v3 给出的结果数组为 2、2、0、2, 2. 结果数组可以是 2 的倍数。
另一个例子:
v1:1、1、1、0、1、0 v2:0、0、1、0、0、0 v3:1、0、0、0、0、0 v4:0、0、0、1、0、0 v5:1、1、0、0、1、0 v6:0、0、1、1、0、0 v7:1、0、1、1、0、0在本例中,v1+v2+v5 和 v3+v6+v7 是合适的答案。
我有一个蛮力解决方案,但我想检查是否有更有效的方法。这相当于子集和问题吗?
【问题讨论】:
-
你能详细说明一下:1.) 集合有多长 2.) 你需要结果和数组吗?
-
每个数组的元素个数和数组的个数在程序开始时是未知的。我实际上并不需要 sum 数组。只是数组的数量。所以如果结果是 v1+v2+v5,我需要 1、2、5。
-
@Banthar wow.. 高斯消除似乎是正确的做法。我只需要找到 Vx=0 的所有可能解决方案,其中 V 是我所有数组的矩阵。我想 x 会给我相应的行号。
-
关于 gauss-Jordan:记住 x 在每个维度上都被限制为 0/1;并且您在每个维度中再次寻找“=0 mod 2”,而不是“=0”(这与将其视为适用于 Vx 的任何规范的“=0 mod2”不同,例如。
-
@Neo,高斯消除对你有用吗?如果是这样,您可以将其发布为答案并接受吗?
标签: c algorithm subset-sum np