三个数组和子集和

时间:2014-03-25 10:29:44

标签: algorithm subset

  

阵列1:1 2 4 8 21

     

阵列2:3 5 6 7 19 20

     

阵列3:9 10 11 12 13 14 15 16 17 18

有3个阵列。 我们从1开始添加数字。 如果数字等于任何子集的总和,我们就无法添加它。

例如:

22无法添加到任何阵列。

  
    

因为1 + 21 = 22,3 + 19 = 22,10 + 12 = 22

  

21无法添加到数组2中。

  
    

因为3 + 5 + 6 + 7 = 21

  

7可以添加到数组2中。

  
    

因为(3 + 5!= 7),(3 + 6!= 7),(5 + 6!= 7),(3 + 5 + 6!= 7)......

  

应按顺序添加数字。 (如果我没有添加22,我就不能添加23)

21是我可以添加的最大数字。

我想添加更多数字。

这个问题有解决方法吗?

这个问题的正确名称是什么?

...谢谢

1 个答案:

答案 0 :(得分:2)

使用这种回溯解决方案(它基本上检查每个可能的分布),我们发现21实际上是你可以使用3个数组添加的最大数字。 请注意,我们并未尝试找到最佳解决方案,而是我们可以添加的最大数量。

def solution(a1, a2, a3, ps1, ps2, ps3, i):
    # First we try to put it on array 1
    m1 = m2 = m3 = 0
    if i not in ps1:
        l = len(ps1)
        ps1.extend([s + i for s in ps1])
        a1.append(i)
        m1 = solution(a1, a2, a3, ps1, ps2, ps3, i+1)
        # Now we backtrack
        a1.pop()
        while(len(ps1) > l):
            ps1.pop()
    if i not in ps2:
        l = len(ps2)
        ps2.extend([s + i for s in ps2])
        a2.append(i)
        m2 = solution(a1, a2, a3, ps1, ps2, ps3, i+1)
        # Now we backtrack
        a2.pop()
        while(len(ps2) > l):
            ps2.pop()
    if i not in ps3:
        l = len(ps3)
        ps3.extend([s + i for s in ps3])
        a3.append(i)
        m3 = solution(a1, a2, a3, ps1, ps2, ps3, i+1)
        # Now we backtrack
        a3.pop()
        while(len(ps3) > l):
            ps3.pop()
    return max(i-1, m1, m2, m3)

返回21