动态规划-完全背包

简介: 前言我们上篇文章学习了动态规划01背包的问题,本篇文章我们继续学习完全背包。大家可以在学习完01背包的基础上再进行学习,比较其两者的解题差异。

「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战」


前言


我们上篇文章学习了动态规划01背包的问题,本篇文章我们继续学习完全背包。大家可以在学习完01背包的基础上再进行学习,比较其两者的解题差异。


完全背包


完全背包实际由01背包演化而来,01背包中每个物品的个数都是1,而完全背包不限制物

品数量,每种物品的数量无限,可以重复加入背包中。


我们来看看完全背包的提问


Q:一共有N种物品,每种物品有无限多个,第i(i从1开始)种物品的重量为w[i],价值为v[i]。在总重量不超过背包承载上限W的情况下,能够装入背包的最大价值是多少?


解题步骤


我们说的解题步骤实际上是动态规划的一个解题步骤


1.定义dp数组


dp数组的定义实际和01背包相同


我们要求的是在总容量为W,物品有N件的情况下,可以取得的最大价值Vmax。有两个变量容量w及物品n,我们设要求的总价值dp[i][j],其中i表示物品可取范围为前i件,即范围[0, i],j表示背包容量。


dp[i][j] // i表示物品可取范围为前i件 j表示背包容量
复制代码


2.递归公式


完全背包和01背包的差异主要体现在递推公式


依据题目,我们可以重复放入第i件物品,所以我们的最大价值应该对比放入不同件数的最大价值


dp[i][j] = Math.max(dp[i - 1][j - n * w[i]] + n * v[i]) // 0 =< n <= j / w[i] n为整数
复制代码

有两种不同的递推思路,其中一种不好理解,我也没理解过来,所以就只列出了第二种


3.dp初始化


初始化和01数组相同


在容量为0的时候时候,dp[i][j]肯定为0

dp[i][0] = 0
复制代码


当所选的物品为0的时候,价值也为0

dp[0][j] = 0
复制代码


4.dp遍历生成

for (let i = 1; i <= N; i++) {
  for (let j = 1; j <= W; j++) {
    for (let n = 0; n <= parseInt(j / w[i])) {
      dp[i][j] = Math.max(dp[i][j] || 0, dp[i - 1][j - n * w[i]] + n * v[i])
    }
  }
}
复制代码


完全背包实例

Q:一共有N种物品,每种物品有无限多个,第i(i从1开始)种物品的重量为w[i],价值为v[i]。在总重量不超过背包承载上限W的情况下,能够装入背包的最大价值是多少?

N = 5;
W = 20;
w = [4, 5, 10, 11, 13];
v = [3, 4, 7, 8, 9];
复制代码
function knapsack() {
  const N = 5;
  const W = 43;
  const w = [4, 5, 10, 11, 13];
  const v = [3, 4, 7, 8, 9];
  // 1.定义dp数组
  // dp[n][w]表示容量为w的情况下可取前n件物品时的最大价值
  const dp = []
  // 2.初始化dp数组
  // 容量为0时价值为0
  for (let i = 0; i <= N; i++) {
    dp[i] = []
    dp[i][0] = 0
  }
  // 可取物品为0时价值为0
  for (let j = 0; j <= W; j++) {
    dp[0][j] = 0
  }
  // 4.dp遍历生成
  // 我们第一层遍历物品
  for (let i = 1; i <= N; i++) {
    // 第二层遍历容量
    for (let j = 1; j <= W; j++) {
      // 3.推导公式
      // 这边有个注意点是dp[i][j]对应的是可取第i个物品的最大价值
      // 但是第i个物品的重量和价值对应的是w[i - 1]和v[i - 1]
      for (let n = 0; n <= parseInt(j / w[i - 1]); n++) {
        dp[i][j] = Math.max(dp[i][j] || 0, dp[i - 1][j - n * w[i - 1]] + n * v[i - 1])
      }
    }
  }
  return dp[N][W]
}
复制代码



多重背包


我们在完全背包的基础上再了解下多重背包


多重背包也是01背包的一种变形,其问题形式为


Q:一共有N种物品,第i(i从1开始)种物品的数量为K[i],重量为w[i],价值为v[i]。在总重量不超过背包承载上限W的情况下,能够装入背包的最大价值是多少?


可以发现多重背包和完全背包非常相似,主要区别在于物品数量限制。其解题思路和完全背包几乎一样,仅仅在递推公式有所区别


dp[i][j] = Math.max(dp[i - 1][j - n * w[i]] + n * v[i]) // (0 =< n <= j / w[i]) 且 (n <= k[i]) n为整数
复制代码


总结


动态规划的三种背包类型,01背包,多重背包,完全背包就已经结束了。后面我们将学习动态规划的另一类问题:公共子串。


参考



相关文章
|
机器学习/深度学习 算法
【优选算法】—— 滑动窗口类问题
【优选算法】—— 滑动窗口类问题
595 0
|
人工智能 数据可视化 Go
R绘图实战|GSEA富集分析图
GSEA(Gene Set EnrichmentAnalysis),即基因集富集分析,它的基本思想是使用预定义的基因,将基因按照在两类样本中的差异表达程度排序,然后检验预先设定的基因集合是否在这个排序表的顶端或者底端富集。
3624 0
R绘图实战|GSEA富集分析图
|
存储 缓存 Oracle
|
9月前
|
数据采集 人工智能 监控
什么是数据治理?2026年数据治理的五大核心目标
2026年,数据治理跃升为驱动数字化转型的核心引擎。市场规模破860亿元,金融、政务、交通成主战场。瓴羊Dataphin以OneID/OneModel/OneService架构,融合AI实现智能元数据、质量监控与敏感识别,支撑全域协同、资产入表与实时决策,让治理真正创造业务价值。(239字)
什么是数据治理?2026年数据治理的五大核心目标
|
9月前
|
人工智能 弹性计算 对象存储
玄晶引擎:基于阿里云生态的全流程AI自动化方案,赋能中小微企业低成本数字化转型
玄晶引擎是阿里云生态原生AI自动化平台,专为中小微企业设计。依托通义千问、ACK、OSS、VectorDB等服务,实现“内容生产—流量分发—精准获客—成交转化”全流程闭环。云原生架构+零代码操作,算力成本降60%,人力节省超60%,3个月可回本。
591 15
|
人工智能 IDE 开发工具
2.4k star 开源项目,Wingman AI + 知识图谱,如何帮你搭建‘私人大脑’?学术/项目必备,让笔记真正活起来!
MindForger 是一款灵感源于人脑思维机制的桌面 Markdown IDE,帮助用户构建私人知识体系。它通过强大的语义联想与结构重构功能,解决笔记混乱、缺乏智能联接等痛点。核心功能包括 TAYR/TAYW 联想、知识图谱浏览器、Markdown 编辑器和 AI 助手 Wingman。支持本地隐私保护,跨平台使用,开源 GPLv2 许可。项目地址:https://github.com/dvorka/mindforger。
585 4
|
数据采集 存储 Docker
深入理解Docker:为你的爬虫项目提供隔离环境
本教程介绍如何使用Docker构建隔离环境,运行Python爬虫项目,采集小红书视频页面的简介和评论。主要内容包括: 1. **Docker隔离环境**:通过Docker容器化爬虫,确保环境独立、易于部署。 2. **代理IP技术**:利用亿牛云爬虫代理突破反爬限制。 3. **Cookie与User-Agent设置**:伪装请求头,模拟真实用户访问。 4. **多线程采集**:提高数据采集效率。 前置知识要求:Python基础、Docker基本操作及HTML解析(可选)。教程还涵盖常见错误解决方法和延伸练习,帮助你优化爬虫代码并避免陷阱。
590 7
深入理解Docker:为你的爬虫项目提供隔离环境
|
10月前
|
弹性计算
阿里云服务器最便宜多少钱一年?38元一年,配置、价格及购买限制介绍
现在阿里云服务器最便宜多少钱一年?38元一年,配置、价格及购买限制介绍来了,亲身测试是38元一年,价格确实便宜,38元一年相当于3元1个月、一毛钱一天。这是一台轻量应用服务器,200M峰值带宽、2核2G、40G ESSD系统盘,不限流量。
|
传感器 人工智能 Java
你知道数字电路的基础逻辑门电路吗,来拿下
基础逻辑门电路是数字电路的核心单元,包括与门、或门、非门、与非门、或非门、异或门和同或门。每种门电路执行特定的逻辑运算,产生相应的输出信号。例如,与门仅在所有输入为高电平时输出高电平;或门只要有一个输入为高电平就输出高电平;非门则对输入信号取反。这些门电路广泛应用于计算机CPU、报警系统、数据校验和同步电路中,是构建复杂数字系统的基石。
2327 0
你知道数字电路的基础逻辑门电路吗,来拿下
|
数据可视化 数据挖掘 Python
【Python DataFrame专栏】DataFrame的可视化探索:使用matplotlib和seaborn
【5月更文挑战第20天】本文介绍了使用Python的pandas、matplotlib和seaborn库进行数据可视化的步骤,包括创建示例数据集、绘制折线图、柱状图、散点图、热力图、箱线图、小提琴图和饼图。这些图表有助于直观理解数据分布、关系和趋势,适用于数据分析中的探索性研究。
677 1
【Python DataFrame专栏】DataFrame的可视化探索:使用matplotlib和seaborn

热门文章

最新文章