回溯法

回溯是一种枚举, 在枚举的过程中,通过条件判断是否成立,来进行剪枝,以此来降级时间复杂度,

eg1. 0-1背包 。

  有n个物品,每个物品的重量分别是n1, n2...... 容器最大能装max的重量,问 怎么样装可以装的最重

思路:

每个物品都有两种选择, 装或者不装,当考察到最后一个物品的时候或者当前的重量已经超过max 则结束。采用递归的方式,

current_max = 0    # 用全局变量记录最大值

result = []

def solution(nums, max_weight):

    def execute(i, current_weight, tmp_list):

        if i == len(nums) or current_weight == max_weight:  #返回的终止条件

            if current_weight > current_max:

                global current_max

                current_max = current_weight

            if current_weight == max_weight:

                result.append(tmp_list)

            return

        execute(i+1, current_weight, tmp_list)   #选择不装

        if current_weight + nums[i] <= max_weight:

            execute(i+1, current_weight + nums[i], tmp_list+[nums[i]]) 装入

    execute(0, 0, [])

nums = [2, 5, 4, 8, 1]

max_weight = 10

solution(nums, max_weight)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在这里,我们再复习一下 LeetCode 第 77 题。剪枝主要的出发点就在于,我们可以提前做好判断,减少不必要的...
    李威威阅读 607评论 0 0
  • 问题描述: 八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后,使得任何一个皇后...
    似曾安生阅读 2,640评论 2 2
  • 先来看装载问题问题背景描述 装载问题可用动态规划解决,但回溯法有时能取得更好的效果 (1)First ship t...
    Moonsmile阅读 5,099评论 1 2
  • 琴是我的初中同学,我们的友谊从少年时代到现在的不惑之年,随着时间的推移而深厚,即是损友又是挚友。琴和东...
    杨芒果阅读 197评论 2 1
  • 零点后的琐记 •吴鸿勇 只要你出门,到外面走走,总会遇见一些陌生的人,听听他们的...
    雁韧阅读 1,044评论 13 42