再探动态规划--背包问题

news2025/2/23 12:24:11

背包问题常见类型:

动态规划问题核心就两个:状态转移方程和遍历顺序

  • 如果求组合数就是外层for循环遍历物品,内层for遍历背包。
  • 如果求排列数就是外层for遍历背包,内层for循环遍历物品。
    状态转移方程是动态规划问题中的核心,它描述了问题的最优子结构,即当前问题的解与子问题的解之间的关系。
  1. 组合问题:
    • 问题描述:从一组元素中选择若干个元素组成一个组合,满足特定的条件。
    • !!!如果排列组合都列出来的话,只能使用回溯算法爆搜。
    • 状态表示:通常使用二维数组dp[i][j],其中i表示考虑前i个元素,j表示目标值。
    • 状态转移方程:
      dp[i][j] = dp[i-1][j] + dp[i-1][j-nums[i]]
      
      其中,dp[i-1][j]表示不选择第i个元素,dp[i-1][j-nums[i]]表示选择第i个元素。
      例子:(力扣518题兑硬币组合数)
class Solution:
    def change(self, amount: int, coins: List[int]) -> int:
        #动态规划 
        dp = [0]*(amount+1) #+1是考虑初始也算一种合法情况
        dp[0] = 1   **#组合问题常常初始状态为1 (即也算一种情况)这样才有数值基础**
        for coin in coins:
            for i in range(coin,amount+1): **#从coin开始遍历确保可以重复使用**
                dp[i] = dp[i] + dp[i-coin]
        return dp[amount]

  1. True、False问题(布尔型动态规划):

    • 问题描述:问题的解可以用True或False表示,通常用于判断某种条件是否成立。
    • 状态表示:通常使用二维数组dp[i][j],其中i表示考虑前i个元素,j表示某种状态(例如是否匹配)。
    • 状态转移方程:
       

      dp[i][j] = dp[i-1][j] or dp[i-1][j-something]

      其中,dp[i-1][j]表示不选择第i个元素,dp[i-1][j-something]表示选择第i个元素,其中something表示某种条件。
  2. 最大最小问题:

    • 问题描述:寻找一组元素中的最大值或最小值,通常是在满足一些条件的情况下。
    • 状态表示:通常使用一维数组dp[i],其中i表示考虑前i个元素。
    • 状态转移方程:
       

      dp[i] = max/min(dp[i-1], dp[i-2], ..., dp[0])

      其中,max/min表示取最大值或最小值。

背包问题解题步骤:

  1. 问题分类:

    • 判断是否为背包问题。
    • 区分三种典型背包问题类型:0-1背包、完全背包、多重背包。
  2. 具体问题分析:

    • 判断是0-1背包问题还是完全背包问题,即是否允许重复使用数组中的元素。
    • 对于组合问题,考虑元素之间的顺序,决定遍历的顺序。

背包问题特征:

  • 给定目标值(target)和一个数组(nums),目标是利用数组中的元素进行排列组合,使其得到目标值。

背包问题技巧:

  1. 0-1背包问题:
    • 元素不可重复使用。
    • 外循环遍历数组(nums),内循环从目标值(target)开始递减。
for num in nums:
    for i in range(target, num-1, -1):
#关于逆序问题  (所以一维dp数组的背包在遍历顺序上和二维其实是有很大差异的 参考:[https://programmercarl.com/%E8%83%8C%E5%8C%85%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%8001%E8%83%8C%E5%8C%85-2.html#%E6%80%9D%E8%B7%AF]() )
    不是所有的0-1背包问题都需要逆序遍历,但逆序遍历是一种常见的做法,特别是在动态规划中,它有助于确保每个物品只被考虑一次。

    逆序遍历的原因是为了保证在更新状态时,不会影响当前状态之后的计算。具体来说,如果我们正序遍历,当考虑第i个物品时,可能会用到第i-1个物品的状态,而如果正序遍 
     历,第i-1个物品的状态可能已经被当前循环更新过,导致结果错误。

    逆序遍历的循环结构通常是这样的:
  
    ```python
    for i in range(target, num-1, -1):
        # 在这里进行状态更新和决策
    ```

    在这个循环中,我们从目标值(target)开始递减,逐步考虑每个可能的背包容量,确保在更新状态时不会影响之后的状态。
  1. 完全背包问题:
    • 元素可重复使用。
    • 外循环遍历数组(nums),内循环从目标值(target)开始递增。
for num in nums: 

    for i in range(num, target+1):
  1. 组合问题考虑元素顺序:
    • 目标值放在外循环,数组放在内循环。
for i in range(1, target+1): 
    for num in nums:

代码示例:

class Solution:
    def combinationSum4(self, nums: List[int], target: int) -> int:
        if not nums:
            return 0
        dp = [0] * (target+1)
        dp[0] = 1
        for i in range(1, target+1):
            for num in nums:
                if i >= num:
                    dp[i] += dp[i-num]
        return dp[target]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2303910.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Javascript使用Sodium库实现 aead_xchacha20poly1305_ietf加密解密,以及与后端的密文交互

Node.js环境安装 sodium-native (其他库可能会出现加密解密失败,如果要使用不一样的库,请自行验证) npm install sodium-native 示例代码,使用的是 sodium-native v4.3.2 (其他版本可能会有变化,如果要使用,请自行验…

【算法与数据结构】单调队列

目录 单调队列 使用单调队列维护滑动窗口 具体过程: 代码实现: 复杂度分析: 使用单调队列优化动态规划 例题 单调队列 单调队列(deque)是一种特殊的队列,队列中的元素始终按严格递增或者递减排列。这样就可以保证队头元素…

Mysql-------事务

事务 一、事务 (一)什么是事务: MySQL数据库事务:(database transaction): 事务是由一组SQL语句组成的逻辑处理单元,这些操作要么全做要么全不做,是一个不可分割的工作单位。 ※…

基于Martin的全国基础底图实现

概述 前面有文章基于Martin实现MapboxGL自定义底图分享了Martin的使用,本文使用网络收集的数据实现了全国基础数据的收集和基础底图。 实现后效果 实现 1. 数据准备 实例中包含如下数据: 边界线和九段线数据省边界面数据省会城市点数据市边界面数据…

网络安全:防范NetBIOS漏洞的攻击

稍微懂点电脑知识的朋友都知道,NetBIOS 是计算机局域网领域流行的一种传输方式,但你是否还知道,对于连接互联网的机器来讲,NetBIOS是一大隐患。 漏洞描述 NetBIOS(Network Basic Input Output System,网络基本输入输…

一周学会Flask3 Python Web开发-客户端状态信息Cookie以及加密

锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili HTTP是无状态(stateless)协议。也就是说,在一次请求响应结束后,服务器不会留下任何关于对…

机器学习面试八股文——决战金三银四

大家好,这里是好评笔记,公主 号:Goodnote,专栏文章私信限时Free。本笔记的任务是解读机器学习实践/面试过程中可能会用到的知识点,内容通俗易懂,入门、实习和校招轻松搞定。 公主号合集地址 点击进入优惠地…

【Akashic Records】THE EGG

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: Akashic Records 文章目录 💯观后感一、宇宙的孤寂与个人成长:二、选择与责任:三、灵性与世界的连接:四、选择如何改变命运:结语: 💯…

从零开始用react + tailwindcs + express + mongodb实现一个聊天程序(一)

项目包含5个模块 1.首页 (聊天主页) 2.注册 3.登录 4.个人资料 5.设置主题 一、配置开发环境 建立项目文件夹 mkdir chat-project cd chat-project mkdir server && mkdir webcd server npm init cd web npm create vitelatest 创建前端项目时我们选择javascrip…

ant design 疑惑记录 Dropdown.Button

onMenuClick是点击展开的 子项的点击事件 Actions的点击事件是什么? 解答: 也是个按钮Button,也有自己的onClick事件 const onMenuClick (e) > {console.log(click, e); }; const otherClick (e) > {console.log(其他操作主按钮…

SAP on Microsoft Azure Architecture and Administration (Ravi Kashyap)

SAP on Microsoft Azure Architecture and Administration (Ravi Kashyap)

Missing required prop: “maxlength“

背景&#xff1a; 封装一个使用功能相同使用频率较高的input公共组件作为子组件&#xff0c;大多数长度要求为200&#xff0c;且实时显示统计子数&#xff0c;部分input有输入提示。 代码实现如下&#xff1a; <template><el-input v-model"inputValue" t…

在windows下安装windows+Ubuntu16.04双系统(下)

这篇文章的内容主要来源于这篇文章&#xff0c;为正式安装windowsUbuntu16.04双系统部分。在正式安装前&#xff0c;若还没有进行前期准备工作&#xff08;1.分区2.制作启动u盘&#xff09;&#xff0c;见《在windows下安装windowsUbuntu16.04双系统(上)》 二、正式安装Ubuntu …

数据库驱动免费下载(Oracle、Mysql、达梦、Postgresql)

数据库驱动找起来好麻烦&#xff0c;我整理到了一起&#xff0c;需要的朋友免费下载&#xff1a;驱动下载 目前收录了Oracle、Mysql、达梦、Postgresql的数据库驱动的多个版本&#xff0c;后续可能会分享更多。

业务流程相关的权威认证和培训有哪些

业务流程的认证和培训种类繁多&#xff0c;旨在帮助专业人士掌握业务流程管理 (BPM) 的知识和技能&#xff0c;从而提升个人职业发展和组织运营效率。下面分别介绍&#xff1a; 一、 业务流程认证和培训的种类 业务流程的认证和培训可以大致分为以下几类&#xff0c;涵盖了不…

vivado修改下载器下载速率

Error Launching Program X Error while launching program: fpga configuration failed. DONE PIN is not HIGH 原因是下载器速度太快了。先从任务管理器中关闭hw_server.exe试一下,要是不行就按下面三种方法解决。 第一种方法可以不用修改下载速度,直接先从vivado中将bit流…

巧妙实现右键菜单功能,提升用户操作体验

在动态交互式图库中&#xff0c;右键菜单是一项能够显著提升用户操作便捷性的功能。它的设计既要响应用户点击位置&#xff0c;又需确保菜单功能与数据操作紧密结合&#xff0c;比如删除图片操作。以下将通过一段实际代码实现&#xff0c;展示从思路到实现的详细过程。 实现右键…

CASS11快捷键设置

快捷键增加如下&#xff1a; tr----trim bo---(-boundary) ro---rotate ed----explode of---offset qs---qselect dp---ptype re---regen rec---rectang br---break dis---distuser do---draworder

HTTP 常见状态码技术解析(应用层)

引言 HTTP 状态码是服务器对客户端请求的标准化响应标识&#xff0c;属于应用层协议的核心机制。其采用三位数字编码&#xff0c;首位数字定义状态类别&#xff0c;后两位细化具体场景。 状态码不仅是服务端行为的声明&#xff0c;更是客户端处理响应的关键依据。本文将从协议规…

如何使用3D高斯分布进行环境建模

使用3D高斯分布来实现建模&#xff0c;主要是通过高斯分布的概率特性来描述空间中每个点的几何位置和不确定性。具体来说&#xff0c;3D高斯分布被用来表示点云数据中的每一个点或体素&#xff08;voxel&#xff09;的空间分布和不确定性&#xff0c;而不是单纯地存储每个点的坐…