好的,这里有一种带修剪的暴力方法。时间复杂度为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}的情况。
这基本上就是我所得到的全部内容。
a = [5]*100
,b = [10]*100
和c = [15]*100
,是有一个解决方案还是 ~100! 个解决方案? - nneonneo