给定n个数字,找到最小数量的子集,其余数字等于0.例如:
{1,1,3,4,5}
结果等于3,因为我们可以删除子集{1,3}(以两种方式)或{3,4,5}。
我正在寻找比O(2 ^ n)蛮力更快的东西。
答案 0 :(得分:4)
让我们考虑一个大小为n * m的动态规划表,其中m = 10 ^ 4。我们有一个大小为n的数组,例如1 <= a[i] <= m
。
现在,D[i][j] = number of subsets such that xor of the set is j
这里集合的xor表示集合的所有元素的xor。
D[i][j] = D[i-1][j] + D[i-1][j xor a[i]]
。这种递归关系可以从新元素a [i]将存在于子集中的事实中得出。
如果[i]不存在=&gt;任何x-1元素的子集,其xor为j
如果存在[i] =&gt; xor为j xor a[i]
的i-1个元素的任何子集。(因为j xor a[i] xor a[i] = j
)
通过这种方式,您可以找到xor是任何给定数字的所有子集。请注意,此给定数字只能与m一样大。提出你的问题,它只是归结为找出xor为X的元素子集,其中X是所有元素的xor。
时间:O(nm)