动态规划(DP)算法初识

article/2025/9/13 8:58:36

先用大白话来说一下几种经典算法大概的意思:

  1. 贪心算法:我就一次机会,为了达到目的,其他的我啥也不考虑
  2. 回溯算法:我有无数次机会,还能怕我有达不到目的的时候?
  3. 动态规划算法:我能随意在任何时候进行存档读档,用最华丽的方法走到终点。

接下来的几篇文章可能都会围绕dp来说,从白话和较多篇幅去解释dp算法的内在

简述

动态规划求解出最优策略的原理是因为显著的降低了时间复杂度,提高了代码的运行效率,但动态规划也确实很难学,不过,一旦我们知道了解决思路,那么对于很多动态规划的问题,也都可以用相似的思路去解决。

将会用实际的问题,更好的去去理解动态规划

0-1 背包问题

在上一期的回溯的相关算法中,我们知道了如何采用递归的思想穷举所有解法,选出最优,然后解决问题,还是这道题,如果我们要对于一组不同重量、不可分割的物品,选择一些装入背包,在满足最大重量限制的前提下,如何最贴近最大重量。

我们首先用递归树看一下回溯的思路:

首先假设每个物品重量是 2 2 4 6 3,我们假设 i 表示将要决策第几个物品是否装入背包,cw表示当前背包中物品的总重量,然后用(i,cw)。比如,(2,2)表示将要决策第2个物品是否要装入背包,决策前,背包的总重为2.

我们可以从递归树明显的看出,有些子问题的求解是重复的,重复的计算必然会造成性能的丢失,如果我们能保留之前的结果,计算之前先检索一下,如果有计算过,那么直接拿过来用,肯定会提升一下性能。

在这里插入图片描述

事实上,动态规划的思路已经和这相差无几,但还是让我们来看看动态规划的思路:

  1. 首先将整体求解分为n个阶段,每个阶段会决策一个物品是否放到包里。
  2. 不论放入还是不放入,背包的重量假设都造成了变化,而这些不同的变化,也就对应着递归树的节点
  3. 合并重复的节点,避免节点指数级增长
  4. 基于这一层的节点,推导出下一层的状态集合

然后用上面的思路,代入到0-1背包问题中做一个思路引导:

  1. 首先我们创建一个布尔类型的二维数组states[n][w],记录每个节点的不同状态。n代表第n个物品,w代表背包能承受的最大质量。
  2. 第0个(假设物品序列从0开始计算)物品的重量是2,放入,就是states[0][2],不放入,就是states[0][0],但是因为最大重量w是9,所以上面两个表达式的结果都是true。
  3. 然后是第一个物品,重量也是2,那么造成的结果就是,states[1][4],states[1][2],states[1][2],states[1][0]
  4. 然后我们发现,有两个表达式重复了,所以合并掉,其他三个因为重量小于9,所以也是true
  5. 不断继续,最后只需要选择最接近9还是true的就行了。

用false代表0,用true代表1,效果图如下:
在这里插入图片描述

然后再用代码表达一下:

在这里插入图片描述
这就是动态规划总体的思路,而且时间复杂度比起回溯的n²也有了很大的改善,为wn,n表示物品个数,而w表示可以承载的总重。

但是为了能够解决所有的情况,我们在存档的时候还是很占用空间的,那么有什么办法降低空间消耗吗?

实际上,我们可以将二维数组转换成一维数组,在动态转移的过程中都可以依靠这个一维数组来完成,下面来展示一下代码:

在这里插入图片描述

0-1背包问题升级版

如果我们再将这些物品赋予价值概念的话,该如何让背包最大可承受重量一定的时候让价值更高。

首先,这个问题也是可以通过回溯的办法解决的:

在这里插入图片描述
还是针对上面的代码画出递归树,和之前的思路相同,只不过加入了一个新的值:value

在这里插入图片描述
我们发现,在很多情况下,重量相同但是价值会有区别,这也就是我们这个题目的目标,舍弃掉相对价值低的,保留相对价值更高的,保留递归的思路,其他状态就不考虑了。

于是我们继续采用动态规划思想。

设一个二维数组states[n][w+1],来记录每层都可以达到的不同状态,不过这次不再是布尔类型了,而是int类型,用来记录当前状态的最大价值。然后按照之前的思路,根据当前阶段,推导出后续状态。

然后翻译成代码:

在这里插入图片描述
其实思路都是和之前相同的,但是在这里引入了第三个变量,也就是value,和之前的例子大同小异,时间复杂度也仍然是wn。


http://chatgpt.dhexx.cn/article/cgHIajl3.shtml

相关文章

常用十大算法_动态规划算法(DP)

动态规划算法(DP) 高能预警:DP算法不容易理解,需要动脑筋查资料找例题 动态规划算法(Dynamic Programming),是将复杂问题拆分成子问题,并在子问题的基础上,求解复杂问题…

动态规划算法(DP)

校招笔试面试前,大家一般都会先去牛客网上刷刷题,《剑指offer》,《leetcode》走起来,然后初次入手,发现很多不会,不会到什么程度呢,连个想法都没有,于是就去讨论区看答案,然后java大神,c++大神会给出花式解答,他们喜欢在答案前加一句,简单的dp算法,递归就可以解决…

【算法笔记】树形DP算法总结详解

0. 定义 树形DP,又称树状DP,即在树上进行的DP,是DP(动态规划)算法中较为复杂的一种。 1. 基础 令 f [ u ] f[u]~ f[u] 与树上顶点 u u u有关的某些数据,并按照拓扑序(从叶子节点向上到根节点…

★动态规划(DP算法)详解

什么是动态规划:动态规划_百度百科 内容太多了不作介绍,重点部分是无后效性,重叠子问题,最优子结构。 问S->P1和S->P2有多少种路径数,毫无疑问可以先从S开始深搜两次,S->P1和S->P2找出所有路…

ubuntu安装qt

Ubuntu安装qt 到qt官网下载“qt-opensource-linux-x64-5.9.1.run” 分别安装g, build-essential, libglq-mesa-dev, libglu1-mesa-dev freeglut3-dev 输入指令:”sudo apt-get install g” -> “sudo apt-get install build-essential” -> “sudo apt-get i…

QT安装、构建套件(MSVC、MinGW)配置

QT安装、构建套件(MSVC、MinGW)配置 1. QT框架及QT Creator下载 登录QT官网-https://www.qt.io/download。 点击downloads for open source users 在页面最下方,点击Download the QT online Installer。 在安装网页的最下方处有一行小字 “We do recommend yo…

QT linux安装

转载地址:http://www.cnblogs.com/tangkaixuan/p/6504102.html 文章来自https://lug.ustc.edu.cn/sites/qtguide/ 1.4 Qt在Linux下安装 Qt在Linux系统里的安装要稍微复杂一些,因为Linux发行版众多,所以安装过程有些差异。 由于Linux系统都可…

Qt国内镜像安装

下载安装程序 https://download.qt.io/official_releases/online_installers/ 使用国内镜像打开安装程序 G:\下载\qt-unified-windows-x64-4.5.1-online.exe --mirror https://mirror.nju.edu.cn/qt清华源 https://mirrors.tuna.tsinghua.edu.cn/qt/online/qtsdkrepository/win…

Qt下载与安装

一、Qt和Qt Creator的区别 Qt是C的一个库,或者说是开发框架,里面集成了一些库函数,提高开发效率。 Qt Creator是一个IDE,就是一个平台,一个开发环境,类似的比如说VS,也可以进行Qt开发&#xff…

Ubuntu 安装QT

一、最近这家公司接到一个订单,客户使用到国产操作系统,意味着需要使用到 Linux 系统,于是乎,之前的东西又要捡起来,而且,平时代码主要是windows 平台,这次需要将代码移植到linux 平台&#xff…

QT的安装------QT

由于现在的qt都是线上下载了,那我们就去qt的官网下载 download.qt.io 我们选择倒数第二个------archive(档案),顺便学一下英文。 然后选择online install(在线安装) 身为先进人,当然选择最新的版本(团新版…

VS+QT安装配置

心血来潮,装个QT,遇到好多问题,记录一下(铭记那些踩过的坑) 软件版本:vs是2022,qt是6.3.1 qt下载地址:Download Qt | Develop Desktop & Embedded Systems | Qt 点进去往下翻&…

Windows Qt安装教程

目录 一、Qt安装包下载二、Qt安装流程 一、Qt安装包下载 Qt官网:https://download.qt.io/ Qt官方提供的专门的资源下载网站,所有的开发环境和相关工具都可以从这里下载,Qt 官方下载网站如下图: 点击进入archive目录,…

Qt安装教程-详细

本文主要介绍了Qt5.9.7的安装步骤。 Qt下载 Qt的下载地址: http://download.qt.io/archive/qt/ qt-opensource-windows-x86-5.9.7.exe 是一个综合的安装包(5.8之前分开下载各个编译器版本SDK),下载后安装的时候可以选择安装哪个编译器对应的SDK。一般可选MinGW 或…

QT下载安装

1、下载路径 https://download.qt.io/archive/qt/5.9/5.9.9/ 文件比较大,建议可以Qt 镜像网站 下载 国内著名的 Qt 镜像网站,主要是各个高校的:中国科学技术大学:http://mirrors.ustc.edu.cn/qtproject/ 清华大学:htt…

QT安装 and VS2019中安装QT插件

目录 VS中安装QT扩展插件1. 安装qt软件2. 在VS中安装qt扩展插件 VS中创建QT项目 VS中安装QT扩展插件 1. 安装qt软件 QT下载网址(各版本). QT(5.12.11)直达界面. 根据操作系统不同,选择相应版本下载 双击运行… 输入QT账号信息&#xff0…

QT安装简介

1、下载QT安装包 下载网址:http://download.qt.io/ 或者http://download.qt.io/archive/qt/ 选择一个你需要的版本,例如 5.10 点击进去后,选择对应操作系统的安装包下载,例如qt-opensource-windows-x86-5.10.0.exe 2、安装QT …

QT安装教程(简易)

官方网址 Qt官方网址:http://download.qt.io 注意!!!!!!!!!!这里下载记得要下载5版本以上的,因为5版本以上的自带打包工具&#xf…

Qt的安装及配置

一、Qt的安装 1.下载链接 或者 网盘下载 链接: https://pan.baidu.com/s/15Fwh8kOtrj4GIIg6ptnb7A 提取码: uvar 2.先注册账号,用自己的qq邮箱就可(注意:密码要有数字和大小写字母) 3.看图 4. 第一个:通过在Q中启用发送假名使用统计数据来…

Linux下的QT安装及初步使用过程(一)

目录 1.QT的安装 2.创建第一个QT程序 (1)QT代码(C) (2)使用qmake工具生成工程文件 ①确保qmake是可用的 ②如果不能找到qmake,则以下方式参考 ③使用qmake生成工程文件 ④生成Makefile文…