从对列表中找到最小值的算法

时间:2014-11-20 01:07:15

标签: algorithm

问题陈述:

给出一对{A | B}对的列表 找到必须从'A'中取'm'值并从'B'中取'n'值的最小总和

  • 您不能对A和B使用相同的“配对”
  • 列表的大小将介于2到500个项目之间
  • 您拍摄的物品数量(m& n)也可能有所不同
  • 对中的数字(A& B)的范围为0-9。

当然可以有多对配对,为您提供正确的最小值。

例如,给定:

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增加,性能也会受到很大影响。

如何改进这种蛮力方法? 这类问题叫什么?

信不信由你,这不是作业!

1 个答案:

答案 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).

追溯最小参数以重建最佳选择。