将项目分配给最少数量的组
Assign items to a minimal number of groups
这是一个流行的 CS 模式,但我显然遗漏了一些关键字,因为我没有找到它。
我有一组 4 个项目:[A,B,C,D]。
我有 3 个组:1、2、3。
第 1 组可以接受 A 或 B。
组 2 可以接受 B 或 C。
第 3 组可以接受 C 或 D。
以尽量减少使用的组数的方式分配项目。
IE。解决方案是:
第 1 组:[A,B]
第 2 组:[]
第 3 组:[C,D]
我该如何以编程方式解决这个问题?我知道我以前见过这个,所以非常感谢任何能为我指明正确方向的关键字或链接。
如果我们把这个问题想象成一个图问题,图中所有的组和项都是节点,组和项之间有边连接,我们可以看出这个问题是Vertex Cover
但是,如果item的个数比较少(小于16),我们可以使用动态规划轻松解决。
这就是集合覆盖问题。它是 NP 难的,所以找到真正的最小集通常很难并且需要指数时间。采用覆盖最多剩余元素的集合的贪婪算法可能会给出很好的近似值。对于大小有界的覆盖集,也可以在合理的时间内解决。有关详细信息,请参阅 http://en.m.wikipedia.org/wiki/Set_cover_problem
这是一个流行的 CS 模式,但我显然遗漏了一些关键字,因为我没有找到它。
我有一组 4 个项目:[A,B,C,D]。
我有 3 个组:1、2、3。
第 1 组可以接受 A 或 B。
组 2 可以接受 B 或 C。
第 3 组可以接受 C 或 D。
以尽量减少使用的组数的方式分配项目。 IE。解决方案是: 第 1 组:[A,B]
第 2 组:[]
第 3 组:[C,D]
我该如何以编程方式解决这个问题?我知道我以前见过这个,所以非常感谢任何能为我指明正确方向的关键字或链接。
如果我们把这个问题想象成一个图问题,图中所有的组和项都是节点,组和项之间有边连接,我们可以看出这个问题是Vertex Cover
但是,如果item的个数比较少(小于16),我们可以使用动态规划轻松解决。
这就是集合覆盖问题。它是 NP 难的,所以找到真正的最小集通常很难并且需要指数时间。采用覆盖最多剩余元素的集合的贪婪算法可能会给出很好的近似值。对于大小有界的覆盖集,也可以在合理的时间内解决。有关详细信息,请参阅 http://en.m.wikipedia.org/wiki/Set_cover_problem