考虑到元素U = {e_1 .... e_n}的范围,我有这些元素C = {s_1 ... s_m}的子集的集合。现在给定一个正整数k,我想找到一个k个元素的解决方案,该解决方案涵盖了最大数量的子集。
一个具体的例子:我有一些歌曲。每首歌都是由音符组成的。如果我只知道如何播放k个不同的音符-哪个k个音符将允许我播放最大数量的歌曲,那么这个最大数量是多少?
这个问题怎么称呼?
答案 0 :(得分:0)
暴力法:
首先从n中找到大小为k的所有不同置换。 然后,对于每个置换,找到其涵盖的子集数量。 记住,例如,如果要采用一个覆盖子集“ s_1”的元素,则必须采用该子集中的所有元素,否则贪婪方法将仅覆盖子集的一部分而不是全部。 然后选择可以提供最大答案的排列。
但是暴力破解方法仅在k小于10时才有效。 由于阶数呈指数级增长,没有比这更好的解决方案,因此,此问题转到np_hard。可以表明,您的问题减少为顶点覆盖问题。
将子集视为树,将元素视为节点。 现在,您的问题是选择k个元素,使其完全覆盖最大数量的树。