假定给定升序的数组 nums = [2, 3, 4, 6, 8, 9] ,目标值为 4 ,求目标和等于 4 的所有子数组的组合,具体如下所示:
nums = [2, 3, 4, 5, 6, 8, 9] # 给定数组
# 所有子序列和为 4 的组合
[2, 2]
[4]
现在用回溯法和剪枝求出所有的满足特定目标的组合:
方法一:这里我们采用的是加法,即采用这里的思想。
nums = [2, 3, 4, 5, 6, 8, 9] # 给定数组
n = 9 # 目标值
def track(index, num):
for i in range(index, len(nums)): # 裁剪枝叶
if sum(num + [nums[i]]) < n: # 不断回溯
track(i, num + [nums[i]])
elif sum(num + [nums[i]]) == n: # 输出符合的结果
print(num + [nums[i]])
return # 因为是升序序列,满足即可跳出此次回溯
else:
return # 不满足即可跳出此次回溯
track(0, [])
输出:
[2, 2, 2, 3]
[2, 2, 5]
[2, 3, 4]
[3, 3, 3]
[3, 6]
[4, 5]
[9]
方法二:这里我们采用的是减法
nums = [2, 3, 4, 5, 6, 8, 9] # 给定数组
m = 9 # 目标值
def track(num, index, n):
for i in range(index, len(nums)): # 裁枝
if nums[i] == n:
print(num + [nums[i]])
return # 因为是升序序列 后面的都不满足了
elif nums[i] < n: # 不断的回溯
track(num + [nums[i]], i, n - nums[i])
else:
return # 因为是升序序列 后面的都不满足了
track([], 0, m)
输出:
[2, 2, 2, 3]
[2, 2, 5]
[2, 3, 4]
[3, 3, 3]
[3, 6]
[4, 5]
[9]
加法和减法本质上并没有什么差别。