如何在矩阵中添加数字以产生最小结果

How to Add Numbers in a Matrix to Yield Minimum Result?

本文关键字:结果 数字 添加      更新时间:2023-10-16

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

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

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

如果我必须从每列中选择一个数字,使得每行最多有一个数字的话,我该如何得到最小的结果?

例如,我可以选择AW BX CY DZAZ BX CY DW,但不能选择AW BW CZ DZ

蛮力的方法似乎需要n!计算。有更快的方法吗?最后,我想在大小为~60的矩阵中添加数字。

此外,所有数字的范围从0到256。

如果你不想自己编写代码,你可以随时使用别人的辛勤工作和善意的出版物。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)