【问题标题】:How to Add Numbers in a Matrix to Yield Minimum Result?如何在矩阵中添加数字以产生最小结果?
【发布时间】:2013-07-01 16:00:04
【问题描述】:

这更像是一个算法/数学问题,但我希望在 C++ 中实现一个解决方案。

假设我有一个这样的矩阵,其中的点代表整数:

   W  X  Y  Z
A  .  .  .  . 
B  .  .  .  .
C  .  .  .  .
D  .  .  .  .

如果我必须从每一列中选择一个数字以使每一行最多有一个数字,我将如何产生最小结果?

例如,我可以选择AW BX CY DZAZ 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 所说的“结果”是选取的整数的总和)

标签: c++ algorithm matrix


【解决方案1】:

如果您不想自己编写代码,您可以随时使用其他人的辛勤工作和善意的出版物。 Haskell 中的这个,在我的旧笔记本电脑上用不到十分之二秒的时间解决了一个 60x60 的随机矩阵。多么棒的算法!

import Data.Algorithm.Munkres
import Data.Array.Unboxed
import Data.List (transpose)

solve n matrix = 
  hungarianMethodInt (listArray ((1,1),(n,n)) $ concat $ transpose matrix)

【讨论】:

    猜你喜欢
    • 2021-05-11
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2018-01-22
    • 2020-12-28
    • 1970-01-01
    相关资源
    最近更新 更多