sum和子数组问题即是给定一个数组,求出所有该数组中和等于某个给定值的情况。
如有以下数组:
如果给定一个数为10,那么在该数组中所有和为10的数字的组合为1+4+5, 2+3+5, 1+2+3+4。对于上述问题
我们该如何求解呢?
这里我们可以用递归的方法进行实现。我们先用一个数组,记录当前值是否取了。如果取了,则该值对应的数组值为true,此
时取了该值的和为新的和即为原来的和加上这个新的数。如果不取,则原来的和不变。
我们直接来看代码
import random
def sum_list(bool_list, n, now_sum):
if n >= len(sum_l):
return
if now_sum + sum_l[n] == sum_num: #如果原有值加上这个值正好为所求的数
bool_list[n] = True #将这个数对应的数组值赋值为true
for i, j in enumerate(bool_list):
if j:
print(sum_l[i], end=' ') #输出所有对应值为true的值
print()
bool_list[n] = True #如果这个数被选
sum_list(bool_list, n+1, now_sum+sum_l[n]) #原来的sum和加上新的被选值
bool_list[n] = False #如果没被选
sum_list(bool_list, n+1, now_sum) #原来的sum值不变
if __name__ == '__main__':
sum_l = random.sample(range(15), 8)
sum_num = 19
bool_list = [False for i in sum_l]
print(sum_list(bool_list, 0, 0))