给定数组中任意数量的数组:
a = [1, 2, 4]
b = [2, 4]
c = [3]
d = [1, 2]
arrays = [a, b, c, d]
我想选择最少数量的这些数组,这些数组与ruby中的数组[1, 2, 3, 4]
相匹配,即"正确"答案是[a, c]
而不是[b, c, d]
。
就我的目的而言,最少数量的数组是否重叠并不重要,只要它们能够满足匹配所需数组的标准。
我可以想象几种蛮力解决方案(例如,将每个元素与其他所有元素结合在一起的嵌套循环),但我想知道是否有最佳/优雅的方法来获得此结果。
答案 0 :(得分:2)
我非常确定(我打赌这个问题是NP完全的)必须检查组合,从一个数组的组合开始,然后,如果不成功,检查两个数组的组合, 等等。
def minimal_cover(arr, target)
(1..arr.size).each do |n|
arr.combination(n).each { |a| return a if (target - a.reduce(:|)).empty? }
end
nil
end
a = [1, 2, 4]
b = [2, 4]
c = [3]
d = [1, 2]
arrays = [a, b, c, d]
target = [1, 2, 3, 4]
minimal_cover(arrays, target)
#=> [[1, 2, 4], [3]]