精确覆盖问题,但对解决方案中子集的确切数量有限制

Exact cover problem but with constraint on exact number of subsets in the solution

我对精确覆盖和类似问题比较陌生,所以请多多包涵。假设我有一个典型的精确覆盖问题,即。给定一组 X 和一组 X 的子集 S,我想找到 S*(S 的子集)精确覆盖 X。但是,我希望解决方案 S* 恰好包含 k 元素。而且,一个解决方案就够了。

我知道 Knuth 的算法 X 旨在 return 所有可能的解决方案。我应该只是 运行 Knuth 的算法并遍历解决方案直到找到一个具有 k 元素的解决方案,还是有(我怀疑)更好的方法?我正在使用 Python 顺便说一句。

对于上下文,X 的大小是 <100,但 S 的大小可以是 10^6。 k 相对较小 <10.

如果 k 很小,您可以简单地尝试添加 k 个额外元素,然后将每个子集复制 k 次,每个副本仅包含 k 个元素之一额外的元素。

另一种方法是将精确覆盖问题作为整数线性规划求解,并使用 ILP 求解器求解。然后,您将有 0-1 个变量 x_i,说明第 i 个子集是否包含在解决方案中,并带有防止重叠集包含在解决方案中的约束。在此公式中,要提供恰好包含 k 个子集的覆盖,您只需添加 sum(x_i) = k.

的附加约束

也可以修改算法 X 以直接处理约束。只需计算到目前为止您选择了多少行,如果您已经选择了 k,则不进一步搜索就失败。同样,忽略少于 k 行的解决方案。