阵列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是我可以添加的最大数字。
我想添加更多数字。
这个问题有解决方法吗?
这个问题的正确名称是什么?
...谢谢
答案 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