好的,有修剪的蛮力方法。这需要 O(N^3)
为了便于演示,我将通过一个 N×N 正方形,其中a和b之和
S:
+ | 4 5 6
--|-------
1 | 5 6 7
2 | 6 7 8
3 | 7 8 9
我正在寻找构建 c={6,7,8}我在S
中找到一个“6” 。我将其删除,并将其行和列标记为不可用
S:
+ | 4 5 6
--|-------
1 | / X /
2 | 6 / 8
3 | 7 / 9
Solution = { (1,5) }
然后我试着找到一个'7'
S:
+ | 4 5 6
--|-------
1 | / X /
2 | / / 8
3 | X / /
Solution = { (1,5) (3,4) }
最后是“6”
S:
+ | 4 5 6
--|-------
1 | / X /
2 | / / X
3 | X / /
Solution = { (1,5) (3,4) (2,6) }
第一个循环('6' 的循环)将继续并找到另一个匹配项:(2,4)。这将形成第二个解决方案 { (2,4) (1,6) (3,5) }
现在,改进这一点的一种方法是,使用一些动态编程:找出所有可能的组合,预先给出结果。
Given c={ 6 7 8}, create sets S_x where x is {6,7,8} and
S_x = { (i,j) } such that S[i][j]=x
So:
S_6 = { (1,2) (2,1) }
S_7 = { (1,3) (2,2) (3,1) }
S_8 = { (2,3) (3,2) }
现在,具有给定启发式的相同算法将在 O(S_l1 * S_l2 * ... S_lN) 中运行,其中 S_li 表示 S_i 的长度。
在一般情况下,这可能运行得更快。它还将正确处理 c={7,7,7} 的情况。
这就是我所得到的。