查找子集的数量,其余数字的xor等于0

时间:2015-11-15 11:02:46

标签: algorithm dynamic-programming

给定n个数字,找到最小数量的子集,其余数字等于0.例如:

{1,1,3,4,5}

结果等于3,因为我们可以删除子集{1,3}(以两种方式)或{3,4,5}。

我正在寻找比O(2 ^ n)蛮力更快的东西。

1 个答案:

答案 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)