2017-02-07 3 views
-1

所与のアレイに入れアレイの任意の数:アレイ組合の最小数を見つけることは別の配列に一致

a = [1, 2, 4] 
b = [2, 4] 
c = [3] 
d = [1, 2] 

arrays = [a, b, c, d] 

私は配列に一致するように組合これらの配列の最小数を選択したい[1, 2, 3, 4]つまり、「正しい」答えは[a, c]で、[b, c, d]ではありません。

私の目的のために、配列の数が最も少なくても、目的の配列に一致する基準を満たすことができます。

いくつかのブルートフォースソリューション(たとえば、各要素を他の要素と結合するネストループ)を想像することができますが、この結果を得るための最適な/エレガントな方法があるかどうかは疑問です。

+0

要素がすでに別の配列に含まれている配列を削除することで、可能な組み合わせの数を減らすことができます。あなたの例では、 'b'と' d'の両方が 'a'で覆われています。 – Stefan

答えて

2

1つの配列の組み合わせから始めて、組み合わせをチェックしなければならないということは確かです(問題はNP完全です)、2つの配列の組み合わせをチェックするのが失敗した場合に。

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]] 
+2

整数の代わりに配列を使った部分集合和の変形のように見えます。部分集合和は確かにNP完全である。 –

+0

お返事ありがとうございます!これは私が来た解決策です。しかし、「コンビネーション」機能について忘れていたのは、それは便利なことです。正しいとマークしてください、ありがとう! –