この問題はMINIMUMk-UNIONとして知られており、次のようにNP困難です。
したがって、入力のサイズが多項式である時間内に実行される、それを解決するためのアルゴリズムを誰も知りません。
あなたの場合、おおよその解決策を喜んで受け入れるでしょう。つまり、材料の小さな結合を含むレシピのコレクションですが、必ずしもそのような最小のコレクションである必要はありません。したがって、欲張りアルゴリズムを試してみることをお勧めします。各段階で、ユニオンのサイズを最小化するレシピを追加することにより、レシピのコレクションを繰り返し構築します。Pythonでのナイーブな実装は次のとおりです。
def small_union(sets, k):
"""
Choose `k` elements from `sets` and return their union. Attempt
to return a fairly small union using a greedy approach.
>>> small_union([{1,2}, {2,3}, {1,2,3}, {1}, {2}], 3)
set([1, 2])
>>> small_union([{1,2}, {2,3}, {3,4}, {1,4}], 3)
set([1, 2, 3, 4])
"""
union = set()
for _ in xrange(k):
s = min(sets, key = lambda s: len(s | union))
sets.remove(s)
union |= s
return union