给定n个整数区间,[a,b]形式中的每一个都包含从a到b的整数。
从每个间隔中,我们必须选择1个数字,这样所有选择的数字的按位或=XX是已知的。
当我们每个间隔有多个候选人来形成x时,我就卡住了。
我能想到的是:
算法:
1)从每个间隔中消除j = 1
中有位j = 0
和位X
的数字。
2)现在找到所需的编号。
问题出现在step 2
中。
考虑区间:[1,3][17,19][15,18]
设x为17=(10001)
1个
11个
10001个
一万零一十
10011个
01111号
10000个
10001个
10010个
应用可能的候选算法的步骤1:
00001(一)
10001(17)
10000(16)
10001(17)
步骤2:
可能的配对:
1)1、17、16
2)1、17、17
现在我们必须选择每一个可能的对,并检查它们是否等于x。
如果一对是大的,就需要很长时间才能得到答案。
那么,可以用一些很好的技巧(优化上面的)或者其他算法来解决这个问题吗?
最佳答案
这里有一个完全不同的方法。
对于每个范围,创建一个BDDr[i] = (a, b)
来表示x[i]
的事实。
创建另一个bdd,表示a <= v[i] <= b
把所有的bdd相交。根据结果,找到任何解。
作为奖励,您还可以:
查找解决方案的数量(不访问所有解决方案)
求最小(或最大)权值的解
找到一个随机解,其中每一个解都有相同的可能性
有一个缺点,就是对于某些输入,bdd的大小将爆炸式增长。
顺便说一下,这是this website处理它的方式(当bdd太大时,它将切换到sat解算器,然后它将无法再报告解决方案的数量)。
关于algorithm - 从每个间隔中找到1个数字,使得所有的OR等于X,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21019898/