【问题标题】:How do I find the all valid pairings between two sets?如何找到两组之间的所有有效配对?
【发布时间】:2014-05-05 22:07:00
【问题描述】:

首先:无论你用哪种编程语言都可以解决这个问题,我很容易将它转换成任何其他语言。

我有一个很难解决的问题,我不知道如何开始。我有 X 种水果和正好 5 种颜色(比如说红色、绿色、黄色、蓝色和紫色)​​。每种水果都有多种颜色可供选择(但至少有 1 种)。当我需要每种颜色的正好 1 个水果但两次没有水果时,我如何找到每种组合(所以总是会购买正好 5 种不同颜色的正好 5 种不同的水果 )?

例如:

1. Pears are available in [Red, Green, Yellow]
2. Apples are available in [Red, Green]
3. Plums are available in [Purple]
4. Grapes are available in [Red, Green, Purple]
5. Bananas are available in [Blue, Yellow]

由于香蕉是唯一可用的蓝色水果,因此可以肯定的是,香蕉将以蓝色而不是黄色购买。

这些将是此列表的解决方案:

1. Yellow Pear, Red Apple, Purple Plum, Green Grapes, Blue Banana
2. Yellow Pear, Green Apple, Purple Plum, Red Grapes, Blue Banana

这里不可能有其他组合。是否有任何算法可以对动态列表执行此操作,该列表也可能有超过 5 个水果?

我知道,这是一个相当困难的问题,但也许有人有一个简单的解决方案。

【问题讨论】:

  • 对于这样一个小问题,您可以简单地测试所有 $5^{5}$ 组合并检查其有效性。 [或使用回溯]
  • 是的,这就是我尝试的。但我仍然不知道如何做到这一点。有没有一种简单的方法可以从 2 个 1D 数组中创建 2D 数组?

标签: algorithm combinations combinatorics


【解决方案1】:

据我了解,问题可以建模为bipartite matching problem;在这里,颜色将构成一个分区,而水果构成另一个分区。颜色c 和水果f 之间的边存在当且仅当水果f 在颜色c 中可用。目标是覆盖所有颜色。

【讨论】:

  • 是的,没错,我在寻找解决方案时也发现了bipartite graphs。但不幸的是,我无法想象如何通过编码来解决这个问题..
  • @SoBiT 您可以使用Ford-Fulkerson 进行简单的实现。如果您将颜色放在图表的左侧,则您的情况下的运行时间将为 O(X)
  • 二分匹配问题可以通过所谓的匈牙利算法en.wikipedia.org/wiki/Hungarian_algorithm 来解决,或者,如果可用,可以使用辅助网络流问题。
  • @Codor Hungerian 对于未加权匹配来说过于复杂和缓慢。它通常用于解决最大权重匹配(分配问题)
  • @NiklasB。也许您是对的,我自己从未实现或尝试过匈牙利算法;您的参考资料似乎更合适。
猜你喜欢
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
  • 2014-01-18
  • 1970-01-01
相关资源
最近更新 更多