当前位置: 首页 > news >正文

[豪の算法奇妙冒险] 代码随想录算法训练营第三十五天 | 01背包问题-二维dp解法、01背包问题-一维dp解法、416-分割等和子集

代码随想录算法训练营第三十五天 | 01背包问题-二维dp解法、01背包问题-一维dp解法、416-分割等和子集


01背包问题-二维dp解法

文章讲解:https://programmercarl.com/背包理论基础01背包-1.html

视频讲解:https://www.bilibili.com/video/BV1cg411g7Y6/?vd_source=b989f2b109eb3b17e8178154a7de7a51

​ 动规五部曲:

  1. 确定dp数组以及下标的含义

​ dp[i][j]表示在[0,i]物品中任取,放入容量为j的背包中的最大价值

  1. 确定递推公式

​ 状态转移方程 dp[i][j] = Math.max(dp[i-1][j],dp[i-1][j-weight[i]] + value[i])

​ 不放第i个物品时,dp[i][j] = dp[i-1][j]

​ 放第i个物品时,dp[i][j] = dp[i-1][j-weight[i]] + value[i]

  1. dp数组如何初始化

​ 当 j = 0,即背包容量为0的时候,背包装不下任何物品,所以最大价值为0,第零列全部初始化为0

​ 第零行,当背包容量不够装物品0的时候,初始化为0,背包容量够的时候初始化为物品0的价值

  1. 确定遍历顺序

​ 根据递推公式 dp[i][j] = Math.max(dp[i-1][j],dp[i-1][j-weight[i]] + value[i]),当前dp取值依赖于它左上方dp的值,所以是从左往右,一行行往下遍历

​ i为物品,j为背包,双重for循环外层遍历物品i,内层遍历背包j

  1. 举例推导dp数组

01背包问题-一维dp解法

文章讲解:https://programmercarl.com/背包理论基础01背包-2.html

视频讲解:https://www.bilibili.com/video/BV1BU4y177kY?vd_source=b989f2b109eb3b17e8178154a7de7a51&spm_id_from=333.788.videopod.sections

​ 动规五部曲:

  1. 确定dp数组以及下标的含义

​ dp[j]表示容量为j的背包所能装的最大价值

  1. 确定递推公式

​ 状态转移方程 dp[j] = Math.max(dp[j],dp[j-weight[i]] + value[i])

​ 不放第i个物品时,dp[j] = dp[j]

​ 放第i个物品时,dp[j] = dp[j-weight[i]] + value[i]

  1. dp数组如何初始化

​ 全部初始化为0

  1. 确定遍历顺序

​ 根据递推公式 dp[j] = Math.max(dp[j],dp[j-weight[i]] + value[i])

​ i为物品,j为背包,双重for循环外层顺序遍历物品i,内层倒序遍历背包j

  1. 举例推导dp数组

LeetCode416 分割等和子集

题目链接:https://leetcode.cn/problems/partition-equal-subset-sum/

文章讲解:https://programmercarl.com/0416.分割等和子集.html

视频讲解:https://www.bilibili.com/video/BV1rt4y1N7jE/?vd_source=b989f2b109eb3b17e8178154a7de7a51

​ 可以抽象为01背包问题,第i个物品的重量和价值都等于nums[i]

​ 动规五部曲:

  1. 确定dp数组以及下标的含义

​ dp[j]表示容量为j的背包所能装的最大价值

  1. 确定递推公式

​ 状态转移方程 dp[j] = Math.max(dp[j],dp[j-weight[i]] + value[i])

​ 不放第i个物品时,dp[j] = dp[j]

​ 放第i个物品时,dp[j] = dp[j-weight[i]] + value[i]

  1. dp数组如何初始化

​ 全部初始化为0

  1. 确定遍历顺序

​ 根据递推公式 dp[j] = Math.max(dp[j],dp[j-weight[i]] + value[i])

​ i为物品,j为背包,双重for循环外层顺序遍历物品i,内层倒序遍历背包j

  1. 举例推导dp数组

image-20260121214135122

class Solution {public boolean canPartition(int[] nums) {if(nums.length == 1){return false;}int sum = 0;for(int i = 0; i < nums.length; i++){sum += nums[i];}if(sum % 2 != 0){return false;}sum /= 2;int[] dp = new int[sum+1];for(int i = 0;i < nums.length; i++){for(int j = sum; j >= nums[i]; j--){dp[j] = Math.max(dp[j], dp[j-nums[i]] + nums[i]);}}if(dp[sum] == sum){return true;}return false;}
}
http://www.jsqmd.com/news/280379/

相关文章:

  • expo-video实现横屏播放
  • Oracle数据库迁移至KingbaseES:完整实战指南
  • 保姆级教程:Ubuntu搭建本地AI助手,从Docker到DeepSeek-R1一站式指南,建议收藏!
  • NAS —— Centos8挂载Nas到本地目录使用(多图完整教程)
  • 由特殊到一般
  • 深入解析:基于势场法的多智能体机器人编队控制
  • 吐血推荐8个AI论文软件,助你轻松搞定本科生毕业论文!
  • 揭秘提示工程架构师在电子商务应用的领先策略
  • SDL2库基础使用
  • android 系统中间件和 平台中间件 的区别,Framework等
  • 宝妈宝爸必看!儿童羽绒服十大名牌揭秘
  • 【Script】加载工程文件
  • 2026元宝优化服务商TOP6推荐——AI搜索时代精准破局指南
  • 详细解释 — Verilog中非阻塞赋值为什么能解决时序逻辑里的“寄存器之间竞争 / 读写不一致” - 详解
  • 2026/1/21
  • 奇迹漫步:促进团队协作的意外方式
  • 宝妈宝爸闭眼入!2026十大儿童鞋服品牌大揭秘
  • 2026最新草本防脱精华国货品牌top6推荐!国内优质防脱护理产品权威榜单发布,科学防脱方案助力健康秀发.
  • vmvare虚拟机使用NAT模式上网
  • 膝盖僵硬患者还能使用座椅电梯吗?
  • 信号有效性选择与故障处理模块
  • 如果我要开发一个typescript、monorepo的 前端工具函数类库,为我设计一下技术选型和目录结构
  • 从结对到自主:让AI交付可运行的工程成果
  • TQD与TQR浅析
  • 大模型提示词工程完全指南:16种核心技巧让你从“高级搜索“到“AI大师“
  • SQL Server Downloads Quick Links
  • 大数据ETL流程:Power BI数据清洗全攻略
  • docker安装centos和jdk
  • LangChain记忆管理:构建智能体连续性的关键技术(值得收藏)
  • Linux 之 Network