【发布时间】:2015-01-05 15:30:53
【问题描述】:
Minimum Set Cover 是一个你必须找到覆盖每个元素所需的最小集合数的问题。
例如,假设我们有一组 X=array(1,2,3,4,5,6) 和另外 5 个集合 S,其中
S[1] = array(1, 4)
S[2] = array(2, 5)
S[3] = array(3, 6)
S[4] = array(1, 2, 3)
S[5] = array(4, 5, 6)
问题是要找到覆盖 X 的每个元素的 S 的最小集合数。显然,在我们的例子中,最小集合覆盖将是 S[4] 和 S[5],因为它们覆盖了所有元素。
有谁知道如何在 C++ 中实现此代码。请注意,这是 NP 完全的,因此没有快速算法来解决它。任何 C++ 解决方案都将受到欢迎。
顺便说一句,这不是作业,我需要在Quine–McCluskey 项目中使用这个算法来生成解决方案的最后一部分。
提前致谢。
【问题讨论】:
-
虽然不是功课,但这也不是代码编写服务。无论如何,贪心方法实现起来都很简单:将集合添加到结果,直到结果包含所有元素。您为什么不自己尝试一下,并在遇到具体问题时提出问题?
-
你想知道什么?算法或一些 C++ 实现细节/提示?如果是后者,具体需要实现哪种算法?
-
我只需要一个 c++ 代码来解决集合覆盖问题
-
@BartoszKP 我如何才能为 2 套组合做到这一点,这没关系,但对于超过 2 套,我怎样才能找到 4 套的所有 3 套组合.....
-
@Jack 我认为您不是在考虑贪心算法,而是在考虑枚举所有可能的解决方案并找到最佳解决方案。那是完全不同的。但这并没有改变这样一个事实,即这不是一个代码编写服务。如果您坚持枚举组合,那么我很惊讶您没有找到这个(例如!):stackoverflow.com/questions/12991758/…