给出几组和一个数字n:
Here assume n is 5:
a - (0,1,2)
b - (0,1,2,3)
c - (1,3,4,5)
d - (0,1,2,4)
e - (2,3,4,5)
f - (3,5)
现在,如果我们只选择b
和c
,我们会得到0到5的整个范围。
我在想一个贪婪的方法,但这似乎不适合这里。
答案 0 :(得分:6)
这是set cover problem,因此,NP-complete,意味着您必须考虑每个可能的解决方案并选择最小值。
答案 1 :(得分:0)
通过检查所有可能的子集可以轻松获得最少数量的集合的最佳解决方案,但当2^k
是集合数时,这将需要k
。
您可以通过构建图表并运行深度为1,2,3的DFS来实现,直到您获得全面覆盖。
在运行时和最佳解决方案之间存在交易。是接受不是最小集,而不是选项,运行时间较短
答案 2 :(得分:0)
BFS搜索可以轻松解决此问题。
min = 0
function bfs(i, visited sets)
if i > m
n = the number of the visited sets without duplicates
if n < min
min = n
end
return
end
if no set contains i
return
end
for each set that contains i
bfs(i+1, visited sets + this set)
end
end
从i = 0开始搜索并清空已访问的集合
bfs(0, empty set)
然后min
将是最小数量的集合。