将项目分配给最少数量的组

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