给定一种食谱作为一组食材,我正在尝试找到构成一周膳食的最少食材。这转化为上述问题,其中N为配方数,M = 7。
eg. if the initial sets are [{1,2}, {2,3}, {1,2,3}, {1}, {2}], and M=3 The minimal union is {1,2}.
我正在寻找高级方法来解决这个问题。我认为可以将其简化为BFS,但是我想看看其他方法是否也可以使其最佳化。
注意:可能有多个这样的集合,并且具有相同的基数。
这个问题被称为MINIMUM k -UNION,它是NP-hard,如下所示:
因此,没有人知道有什么算法可以解决输入时间为多项式的时间运行算法。
在您的情况下,您可能会乐于接受一个近似的解决方案:即包含少量成分的配方的集合,但不一定是最小的此类集合。因此,我建议您尝试使用 贪婪算法 :通过在每个阶段添加最小化并集的配方来迭代地构建配方集合。这是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