给定N个整数区间[lo_i,hi_i]。
从每个区间中选择一个数字,使它们的按位或值成为给定的数字X。(如果生成的数字是Y,则即使结果比X有更多的1位,也不重要;即应满足(X&Y)==X)
给定N个整数区间[lo_i,hi_i]。
从每个区间中选择一个数字,使它们的按位或值成为给定的数字X。(如果生成的数字是Y,则即使结果比X有更多的1位,也不重要;即应满足(X&Y)==X)
我猜这个问题是NP完全的,尽管我还没有找到一个易于约化到此问题的NP困难问题。
但对于那些包含2^(最高有效位)-1的集合,我会使用启发式方法:首先,尝试数字1...1
(最高有效位-1个1),其次是具有最高有效位和尽可能多的其他位设置的数字。这种启发式方法只有在您需要从设置了最高有效位和少量不同较低有效位的集合中选择数字时才会表现不佳。
借助这种启发式方法,您也可以从这些集合中选择最大的数字1....1作为进一步的启发式方法。
让我们一般化这个问题。我将编写位运算符,如OR、AND和SR(右移)。
给定自然数X,由自然数组成的区间[lo_1, hi_1],...,[lo_N,hi_N]和位b(0或1),确定是否存在自然数y_1在[lo_1,hi_1]中,...,y_N在[lo_N,hi_N]中,使得令Y = y_1 OR ... OR y_N,则(X AND Y) = X,并且存在i使得x_i <= hi_i - b。
我的递归算法的基本情况是当lo_1 = hi_1 = lo_2 = ... = hi_n = 0时。只有当X = 0且b = 0时才存在解决方案。
归纳地,通过让X'= X SR 1,lo_i' = lo_i SR 1和hi_i' = hi_i SR 1来准备子问题。如果hi_i AND 1 = 1,则Odd(i)为true。如果奇数,则Odd +(i)为true,如果Odd(i) and lo_i < hi_i。如果X AND 1 = 0:
如果存在i使得Odd+(i),则令b'=0。否则,让b'=b。
X
吗? - Ade YUX|Y == X
?如果该区间中没有这样的数字Y
,该怎么办?我正在考虑[8, 9]
和X = 6
。 - hroptatyrX == 15
时,从[13,14]
和[1,2]
中,你选择了14
和1
,使得(14 | 1) & X == X
。 - Ade YU(a xor b) xor b = a
。 - John Eipe