从多个集合中选择全局不同的值

时间:2016-03-09 20:57:33

标签: algorithm

我有N个列表,其中包含不同数量的对象,并且每个列表都包含X个必需的不同值。

一个简单的例子:

app

这里有一个解决方案是从List1中选择1和2,从List2中选择3,从List3中选择4

但如果问题看起来像这样,那就没有解决方案

List1 = [ 1,2,3,4 ] : 2
List2 = [ 2,3,4 ] : 1
List3 = [ 1,2,4 ] : 1

因此,解决此问题的强力解决方案是从第一个列表中选择所需数量的对象,然后从第二个列表中选择所选数字,其中所选数字不能在之前选择的位置。如果失败,请从第一个列表中选择其他对象,依此类推。

然而,这并不高效,我可能会在找到解决方案之前尝试所有组合,如果有的话。

那么,还有其他方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

此问题可以根据流量网络进行重述,并使用多个maximum flow algorithms解决:

  • 添加源顶点S
  • 为每个集合添加顶点G i
  • 从S添加边缘到 i ,其容量等于要选择的项目数
  • 为所有集合的 union 中的每个不同数字添加顶点N i
  • 在每个G i 和N i 之间添加容量为1的边,其中集合包含数字
  • 添加接收器顶点T
  • 在每个N i 和T
  • 之间添加容量为1的边

以下是您的问题的流网络的外观:

Flow Network

如果最大流算法不产生等于所需总数的流量,则问题无法解决。否则,使用算法为G i 和N i 之间的边缘生成的容量分配,以确定哪些数字为从每一组中取出。