【发布时间】:2013-07-01 16:00:04
【问题描述】:
这更像是一个算法/数学问题,但我希望在 C++ 中实现一个解决方案。
假设我有一个这样的矩阵,其中的点代表整数:
W X Y Z
A . . . .
B . . . .
C . . . .
D . . . .
如果我必须从每一列中选择一个数字以使每一行最多有一个数字,我将如何产生最小结果?
例如,我可以选择AW BX CY DZ 或AZ BX CY DW,但不能选择AW BW CZ DZ
蛮力方法似乎需要 n!计算。有更快的方法吗?最终我想在大小约为 60 的矩阵中添加数字。
此外,所有数字的范围都是从 0 到 256。
【问题讨论】:
-
n 确实是阶乘。我的错。
-
en.wikipedia.org/wiki/Hungarian_algorithm 您的问题与此问题类似。
-
假设您从 AW、BX 或 BW、AX 开始:在这两种情况下,A、B 行和 W、X 列都会出现。以递归方式思考并缓存结果应该可以解决问题。见en.wikipedia.org/wiki/Dynamic_programming
-
@Tarik,4 箱而不是 2 箱取出 A、B 行和 W、X 列:AW-BX; BX-AW; AX-BW; BW-AX。无论如何,我同意动态编程是一种合理的方法
-
@user2548103 为什么不将其发布为答案?这个问题不仅看起来“相似”,它完全是同一个问题。 :) (如果我们假设 OP 所说的“结果”是选取的整数的总和)