如何在矩阵中添加数字以产生最小结果? 这是一个算法/数学问题,但我希望在C++中实现一个解决方案。

如何在矩阵中添加数字以产生最小结果? 这是一个算法/数学问题,但我希望在C++中实现一个解决方案。,c++,algorithm,matrix,C++,Algorithm,Matrix,假设我有一个这样的矩阵,其中点表示整数: W X Y Z A . . . . B . . . . C . . . . D . . . . 如果我必须从每列中选择一个数字,使每行最多有一个数字,那么我将如何产生最小的结果 例如,我可以选择AW-BX-CY-DZ或AZ-BX-CY-DW但不能选择AW-BW-CZ-DZ 蛮力方法似乎需要n!计算。有没有更快的办法?最后,我想在大小为~60的矩阵中添加数字 而且,所有数字的范围都在0到256之间。如果您不想

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

   W  X  Y  Z
A  .  .  .  . 
B  .  .  .  .
C  .  .  .  .
D  .  .  .  .
如果我必须从每列中选择一个数字,使每行最多有一个数字,那么我将如何产生最小的结果

例如,我可以选择
AW-BX-CY-DZ
AZ-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)

确实是n阶乘。我的错误。您的问题与此问题类似。假设您从AW、BX或BW、AX开始:在这两种情况下,A、B行和W、X列都将被删除。按照这些思路递归地思考并缓存结果就可以了。参见@Tarik,4个案例,而不是2个取出行A、B和列W、X:AW-BX;BX-AW;AX-BW;BW-AX。不管怎样,我同意动态规划是一种可行的方法approach@user2548103你为什么不把它贴出来作为答案呢?这个问题不仅看起来“相似”,而且完全是同一个问题(如果我们假设OP所说的“结果”是所选整数的总和)