给定n个整数数组。找到给定数组的所有子集中具有最大OR值的子集的最小长度。
如何解决这个问题?
答案 0 :(得分:2)
最大OR只是所有项目的OR,唯一真正的问题是找到OR值到该值的最小子集。
这是Set Cover问题的搜索版本,在某种意义上它显然可以通过将其视为Set Cover的搜索版本的实例来解决,并且在某种意义上你可以编写一个Set Cover实例这个问题的条款,所以它是NP难的(不是NP完全的,因为它不是决策问题)。
你可以用整数线性规划,SAT求解(因为SAT没有优化而花费多个查询),动态编程,以及其他技术无疑来解决这个问题。
例如,要使用DP,我们可以执行以下操作,假设WLOG * 输入数组(A
)的OR为m
,这是2减去1的幂。(*因为任何始终为0的位位置都可以忽略并从问题中删除而不更改结果子集)
建立一个大小为S
的表格,S[i][x]
是覆盖面具A[0..i]
的{{1}}的最小子集的大小。
x
最小封面的大小可以在S[0][0] = 0
for x in 1..m+1:
S[0][x] = n+1
for i in 0..n:
for x in 0..m+1:
S[i+1][x] = min(S[i][x & ~A[i]] + 1, S[i][x])
中找到,封面本身可以在#34;后面的通常"向后路径中重建。方法。如果S[n][m]
导致其左操作数与包含项min
相对应,则i
导致其右操作数与不对应,包括项{{ 1}},如果它不明确,那么任何一条路径都会导致一个同样好的解决方案。
与基于SAT或ILP的算法不同,此算法无法利用问题实例可能具有的任何有用结构。