给定n个数字,找到最小数量的子集,使剩余数字的xor等于0.例如:
cart[i]
结果等于3,因为我们可以删除子集{1,3}(以两种方式)或{3,4,5}。
我正在寻找比O(2 ^ n)暴力更快的东西。
这是该问题的副本: Find number of subsets, that xor of remaining numbers equals to 0
但OP标记的答案真的不清楚。你能重新描述一下吗?或者只是自己添加一些东西。
答案 0 :(得分:0)
阐述我以前的answer:
输入:大小为n的数组a 1 <= a[i] <= m
输出:子集数量,使剩余数字的xor为零。请注意,这相当于xor = X where X = xor of all elements of a
考虑你的例子,
X = XOR({1,1,3,4,5}) = 2
验证XOR({1,3})=2
和XOR({3,4,5})=2
其中XOR(set)== XOR of all elements of set
解决方案:
考虑大小为n * m的Dynamic Programming表。
D[i][j] = #subsets considering first i elements of a whose xor is j
现在要计算表,您需要定义以下递归关系:
D[i][j] = D[i-1][j] + D[i-1][j xor a[i]]
。
直觉/证明:
您需要计算xor为j的第一个i元素的子集数。专注于ith元素a [i],
i-1
元素的任何子集都是有效的
i-1
的{{1}}个元素的任何子集都有效。这是因为当我们在这个集合中添加[i]时,我们有j xor a[i]
。所以新集的xor是j。
答案:最后你已经填满了整张桌子。您的答案是j xor a[i] xor a[i] = j
,因为您需要xor为X的子集。