zoukankan      html  css  js  c++  java
  • 关于动态规划背包问题的总结

    做了LeetCode背包几道题吧,有些感觉了,故来总结一波。本文只针对01背包和完全背包,对于考研复试够用了。其他背包有待补充.......

    参考代码随想录Carl博文

    如何区分01背包和完全背包?

    每种物品只能取一次(或nums数组中的每个数字只能用一次)为01背包。每种物品有无数个(或nums数组中的每个数字可用多次)为完全背包。

    背包问题的遍历顺序(针对滚动数组一维dp)?

    先遍历物品后遍历背包容量 or 先遍历背包容量后遍历物品?

    1. 针对01背包。先遍历物品后遍历背包容量且遍历背包容量时倒序遍历。解释:数组中元素不可重复使用。

    2.针对完全背包。先遍历物品后遍历背包容量且遍历背包容量时正序遍历。解释:数组中元素可以重复使用。

    3.针对组合个数求和问题。先遍历物品后遍历背包容量。 解释:组合不考虑元素先后顺序问题。

    4.针对排列个数求和问题。先遍历背包容量后遍历物品。 解释:排列问题考虑元素先后顺序。

    小结:

    01背包和完全背包的区别在于内层循环是倒序还是正序。而组合个数和排列个数一般会出现在完全背包中。

    递推公式及初始化

    1. 最大(小)值(如01背包、完全背包问题)

    dp[j] = max(dp[j], dp[j-weight[i]]+value[i]),dp数组一般初始化为0(非负数),若为负数就要初始化为负无穷。若求最小值,数组初始化为正无穷

    上面这个公式并不是一成不变的。比如涉及数组数字时,weight和value可能就为nums[i],涉及字符串value[i]可能等于1,表示的字符串本身。

    2. 组合排列问题

    dp[i] += dp[i-num],dp[0]一般初始化为1

    上面这个要注意是否会超int之类的小细节

    相关题目及分类

    01背包:

    ACwing 01背包

    LeetCode 416. 分割等和子集

    LeetCode1049. 最后一块石头的重量 II

    LeetCode 474.一和零

    LeetCode 494. 目标和——组合

    完全背包:

    ACwing 完全背包

    LeetCode 518. 零钱兑换 II——组合

    LeetCode 377. 组合总和 Ⅳ——排列

     

  • 相关阅读:
    夏季适合IT程序员的养生小妙招
    夏季适合IT程序员的养生小妙招
    JS实现分钟数和时间小时 格式的转换
    Linux入门基础(1)
    Linux入门基础(1)
    Linux入门基础(1)
    常见通信协议HTTP、TCP、UDP的简单介绍
    BMP彩色转成黑色二值图
    《暗时间》笔记
    L53-Maximum-Subarray
  • 原文地址:https://www.cnblogs.com/fresh-coder/p/14409038.html
Copyright © 2011-2022 走看看