问题陈述:
给出一对{A | B}对的列表 找到必须从'A'中取'm'值并从'B'中取'n'值的最小总和
当然可以有多对配对,为您提供正确的最小值。
例如,给定:
1 - {4,5}
2 - {3,2}
3 - {3,1}
4 - {1,0}
并且希望从A中获得2,从B中获得1
正确的答案是 5
取2A(3),4A(1)和3B(1)。
另一个例子是:
1 - {5,4}
2 - {2,1}
3 - {6,6}
4 - {2,1}
5 - {5,5}
并且希望来自A的2,来自B的2,正确的答案是 12
取1A(5),5A(5),2B(1),4B(1)。
我已经使用蛮力方法解决了这个问题,但当然随着列表变大,m / n增加,性能也会受到很大影响。
如何改进这种蛮力方法? 这类问题叫什么?
信不信由你,这不是作业!
答案 0 :(得分:0)
它可以表示为minimum-cost flow problem。设对(a_i,b_i)。创建顶点s,t,a,b,u_i和弧从s到a(容量m,成本0),从s到b(容量n,成本0),从a到u_i(容量1,成本a_i),从b到u_i(容量1,成本b_i),从u_i到t(容量1,成本0)。从s到t尽可能便宜地发送m + n个流量单位。在a-> u_i上的流程意味着选择了a_i。 b-> u_i上的流量意味着选择了b_i。
它也可以通过动态编程来解决。让Cost[i, j, k]
成为从第一个i
对中选择j
A和k
B的最小总和。然后我们有复发关系
Cost[0, 0, 0] = 0
Cost[i, j, 0] = infinity
(for all i, j such that i > 0 or j > 0)
Cost[i, j, k] = min {Cost[i, j, k-1],
Cost[i-1, j, k-1] + a_k,
Cost[i, j-1, k-1] + b_k}
(for all i, j, k such that k > 0).
追溯最小参数以重建最佳选择。