我有以下问题,例如:
给出一个带符号的桶
1 1 2 3 3 4
还有创造配对的食谱书,例如:
12
13
24
从桶优化配对中选择,在桶中留下尽可能少的符号。因此,使用上面的示例性值,最佳配对将是:
13
13
24
哪个会使用给定的所有符号
从桶中挑选天真可能会导致如下情况:
12
13
离开3
和4
无法比拟。 3
和4
无法匹配,因为该书不包含该特定连接的配方
备注:
真正的问题平均包含: 500 元素,大约 30 种符号。
我们尝试使用强力算法来实施解决方案,但是我担心即使是我们的孙子也不会活得足够长,看不到结果:)。
食谱书的大小没有限制,甚至可以在桶中尽可能地使用。不允许两次由相同元素组成的对。
完全清空水桶不需要答案。它只是让大多数成对出局。可以把一些留在桶里。最好寻找最佳解决方案,但近似也足够好。
我将非常感谢提出/提示解决问题的算法的答案。
示例:
斗:
1 1 2 2 2 2 3 3 3 4 5 6 7 8 8
食谱书:
12 34 15 68
最佳结果(可能之一):
{1 2} {1 2} {3 4} {6 8}
剩余的:
2
2
3
3
5
7
8
答案 0 :(得分:2)
这个问题基本上是maximum matching problem,只有小转折,你可以拥有重复的对象。假设您有一个最大匹配的求解器,这是解决此问题的一种方法:
为输入列表中的每个数字创建一个节点。
对于每个食谱,对于与该食谱匹配的每对数字,在这些数字的节点之间添加一条边。
运行最大匹配算法并返回以此方式报告的对。
您可以使用大量现成的最大匹配算法,如果您需要自己编写一个代码,请考虑Edmonds' Blossom Algorithm,这比其他代码效率更高,编码也更少。方法
答案 1 :(得分:1)
首先生成所有可能的符号对,并用每个符号的索引存储它们,所以如果你有n个符号,那么将生成n *(n + 1)/ 2对(最大情况n = 500然后将生成125250对。
Ex:带符号的桶1 1 3 然后生成的对是(11,1,2)(13,1,3)(13,2,3)。 一般格式(a [i] a [j],i,j)。
现在让我们循环生成的对并删除配方书中不存在的对,所以现在我们最多有30对。
接下来让我们构建一个图形,使得节点是我们生成的对,并且如果2对的索引不同(在我们的对上使用2个嵌套循环),则每个2个节点连接。
最后,我们可以执行 BFS 或 DFS ,找到所有生成的图表之间的最长图表,这可以解决我们的问题。
如果您想要c ++ / Java实现,请不要犹豫。