我有一组任意项目(下面的点),以及一些以任意方式重叠的类别(下面的 AC)。测试是确定是否有可能将每个项目分配到一个类别中,在它已经属于的类别中,这样每个类别最终都至少有一定数量的项目。
因此,例如,我们可能要求 A、B 和 C 各有权要求一项。如果我们得到下面所有 4 个点,表明这是可能的很容易:只需将所有项目粘贴到列表中,遍历类别,并让每个类别删除它也有权访问的项目,只要每个类别能够删除一项,我们通过了测试。
现在假设我们移除蓝点并重复测试。显然,我们可以将黄色分配给 A,将红色分配给 B,将绿色分配给 C,然后我们再次通过。但是很难编写这个解决方案:如果我们按照前面的方法(同样没有蓝点),那么假设 A 从删除绿点开始。现在如果 B 移除了黄点,我们将通过测试(因为 C 无法移除红点),而如果 B 移除了红点,C 仍然可以取黄色并通过。
可以通过迭代每个可能的项目到类别的分配来通过蛮力解决这个问题,检查每次迭代是否满足条件,但这不能很好地扩展到任意数量的项目和类别,我有一种感觉有一种更聪明或更有效的方法。
我不知道这个问题的名称,这使得研究变得困难。它有最优解吗?如果是这样,我可以期望解决方案具有什么样的复杂性?