Python中的回溯法和剪枝的应用:求数组中满足目标的子数组(1)

假定给定升序的数组 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]

加法和减法本质上并没有什么差别。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值