查找其联合与另一个数组

时间:2017-02-07 21:39:55

标签: arrays ruby optimization

给定数组中任意数量的数组:

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]

就我的目的而言,最少数量的数组是否重叠并不重要,只要它们能够满足匹配所需数组的标准。

我可以想象几种蛮力解决方案(例如,将每个元素与其他所有元素结合在一起的嵌套循环),但我想知道是否有最佳/优雅的方法来获得此结果。

1 个答案:

答案 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]]