本文默认读者具有动态规划前置知识


  • 动态规划的特点:
  1. 重叠子问题
  2. 状态转移方程
  3. 最优子结构
  • 题型:求最值
  • 解题套路:
  1. 明确【状态】
  2. 明确【选择】
  3. 明确dp函数/数据的定义
  4. 明确base case

  • 例:给你一个可装载容量为W的背包和N个物品,每个物品有重量和价值两个属性。其中第i个物品的重量为wt[i],价值为va[i],现在让你用这个背包装物品,最多能装的价值是多少?
  • 在这里将问题具体化:现在有4 (N=4)个物品,背包总容量为8 (W=8),背包最多能装入价值为多少的物品?
物体编号 物体体积 物体价值
1 2 3
2 3 4
3 4 5
4 5 6
  • 第一步,明确状态和选择

  • 状态:背包的空余容量剩多少;可选择的物品还有哪些

  • 选择:把这个物品装进背包;把这个物品装进背包

  • 第二步,明确dp数组的定义:对于前1个物品,当背包的容量为w时,可以装的最大价值是 dp[i][w]

  • 比如说,dp[4][8]=10的含义为:
    对于给定的一系列物品中,若只对前4个物品进行选择,当背包容量为8时,最多可以装下的价值为10。

  • 根据此定义,还可得出:base case为dp[0][…] = dp[…][0] =0(编号为0,不装物品;容量为0,装不下任何物体),我们想计算的结果是 dp[N][W]

  • 背包容量为1,物品编号可选为1,通过上表可知,物品编号为1时物品体积为2,所以此时选择不装任何物品。

  • 背包容量为2,物品编号可选为1,装入则价值为3。依次往后填充该行。

  • 背包容量为3,物品编号可选为1、2时,装入编号为2的物品,此时价值为4。

  • 背包容量为5,物品编号可选为1、2时,装入编号为1和2的物品,此时价值为7。

  • 依次往后填充完该表格

  • 第三步,根据[选择]写出状态转移逻辑:在w的约束下,把物品i装进背包,最大价值是多少;在w的约束下,不把物品i装进背包,最大价值是多少?

for(let i=1;i<=n;i++) {for(let v=w[i]; v<=c;v++) {dp[i][v] = Math.max(dp[i-1][v], dp[i-1][v-w[i]]+value[i])}
}

  • 背包问题完整求解代码:
// 入参是物品的个数和背包的容量上限,以及物品的重量和价值数组
function knapsack(n, c, w, value) {// dp是动态规划的状态保存数组const dp = (new Array(c+1)).fill(0)  // res 用来记录所有组合方案中的最大值let res = -Infinityfor(let i=1;i<=n;i++) {for(let v=c;v>=w[i];v--) {// 写出状态转移方程dp[v] = Math.max(dp[v], dp[v-w[i]] + value[i])// 即时更新最大值if(dp[v] > res) {res = dp[v]}}}return res
}

  • 扩展 – 最长上升子序列模型
题目描述:给定一个无序的整数数组,找到其中最长上升子序列的长度。
示例:
输入: [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。
  • 代码实现
/*** @param {number[]} nums* @return {number}*/
// 入参是一个数字序列
const lengthOfLIS = function(nums) {// 缓存序列的长度const len = nums.length  // 处理边界条件if(!len) {return 0}// 初始化数组里面每一个索引位的状态值const dp = (new Array(len)).fill(1)// 初始化最大上升子序列的长度为1let maxLen = 1 // 从第2个元素开始,遍历整个数组for(let i=1;i<len;i++) {// 每遍历一个新元素,都要“回头看”,看看能不能延长原有的上升子序列for(let j=0;j<i;j++) {  // 若遇到了一个比当前元素小的值,则意味着遇到了一个可以延长的上升子序列,故更新当前元素索引位对应的状态if(nums[j]<nums[i]) {dp[i] = Math.max(dp[i], dp[j] + 1)  }}// 及时更新上升子序列长度的最大值if(dp[i] > maxLen) {maxLen = dp[i]}}// 遍历完毕,最后到手的就是最大上升子序列的长度return maxLen
};

动态规划(01背包问题)相关推荐

  1. 动态规划—01背包问题

    原文作者:弗兰克的猫 原文地址:[动态规划]01背包问题 摘要: 01背包问题:n个物品放入容量为c的背包中. 常见解法: 分治法:递归计算,且存在重复计算的bug 自上而下填表法:从大到小使用递归计 ...

  2. 动态规划——0-1背包问题

    文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 1 0-1背包问题 背包能够承受的总重量一定w,每个物品的总量不同int[] weight表示.怎么放才 ...

  3. 动态规划——01背包问题 看此一篇文章就够了

    本文讲述经典算法--动态规划的 常见问题 01背包  一篇文章带你学会01背包问题,妈妈再也不担心我遇到01背包了!!! 问题描述 有n个物品,它们有各自的体积和价值,现有给定容量m的背包,如何让背包 ...

  4. 动态规划---01背包问题(2种方法)

    一.动态规划 代表一类问题(最优子结构或子问题最优性)的一般解法,是设计方法或者策略,不是具体算法 本质:递推,核心是找到状态转移的方式,写出dp方程. 解决问题:交叉,重叠子问题(最优子问题) 形式 ...

  5. 动态规划01背包问题入门学习,详细笔记,推荐阅读

    问题描述: 给定N种物品和一个背包.物品i的重量是Wi,其价值位Vi ,背包的容量为C.问应该如何选择装入背包的物品,使得转入背包的物品的总价值为最大?? 在选择物品的时候,对每种物品i只有两种选择, ...

  6. python实现动态规划0-1背包问题

    一.动态规划算法介绍 动态规划算法通常用于求解具有某种最优性质的问题.在这类问题中,可能会有许多可行解.每一个解都对应于一个值,我们希望找到具有最优值的解.动态规划算法与分治法类似,其基本思想也是将待 ...

  7. 详解动态规划01背包问题--JavaScript实现

    对其他动态规划问题感兴趣的,也可以查看 详解动态规划最少硬币找零问题--JavaScript实现 详解动态规划最长公共子序列--JavaScript实现 一开始在接触动态规划的时候,可能会云里雾里,似 ...

  8. 动态规划--01背包问题详解

    代码随想录day42和day43 动态规划 模块01背包问题 "即使到不了远方,心中也要有远方的模样." 文章目录 1. 01背包理论基础 1.1什么是背包问题 1.2二维dp数组 ...

  9. 1.动态规划--01背包问题

    动态规划 DP问题思考时候分成两大部分考虑 1. 状态表示 f(i,j) (1) 集合:(所有选法的集合) 所有选法 条件: 1.从前i个物品中选 2. 总体积m<=j (2) 属性 最大值.最 ...

  10. 动态规划-01背包问题

    大佬整理的理解链接:(建议先看一遍自行理解DP思想再去看代码) 动态规划之01背包问题 - kkbill - 博客园01背包问题 问题描述: 给定 n 件物品,物品的重量为 w[i],物品的价值为 c ...

最新文章

  1. 拜访了这位小哥的GitHub后,我失眠了!
  2. helm添加仓库命令:helm repo add带用户名密码
  3. Vue — 第五天(路由)
  4. 设定pic单片机端口为输入_PIC单片机IO端口的软件/硬件可靠性使用方法讨论
  5. 获取Access中的所有用户表(例子)
  6. ubuntu14.04+CUDA7.5+cuDNN+caffe的超详细完整配置
  7. FTP 客户端C实现
  8. STM32F429+W25Q256+TouchFGX
  9. C语言IDE和编辑器比较
  10. CEOI2017 Mousetrap
  11. 微信网页授权流程 时序图
  12. Android开发学习之路--UI之简单聊天界面
  13. iOS-使用CoreLocation定位
  14. 玩知乎五年,我赚了多少钱?
  15. C++超市商品管理系统设计最新版
  16. 什么是windows的域(Domain)?
  17. php版工行聚合支付和e支付
  18. 浙江大学计算机学院钱沄涛实验室,浙江大学导师介绍--钱沄涛
  19. DDS信号发生器原理与vivado仿真
  20. 80386读书笔记之保护虚拟地址存储方式(—)

热门文章

  1. Hi3516DV300环境搭建
  2. win10系统如何打开.swf视频文件,flash palyer无法使用
  3. 设计师不可缺少的6款设计软件,用了立马升职加薪
  4. windows 查找目录下文件中包含某个字符串
  5. win10系统哪个是索引服务器,小编教你在Win10系统下建立索引的方法技巧
  6. 解决薪资倒挂的最佳方式!
  7. mysql大括号的意思_正则(括号)、[中括号]、{大括号}的区别
  8. python求语音信号短时能量、短时过零率、语谱图
  9. 宝宝终于退烧了,高兴
  10. JVM学习之---了解JIT