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

代码随想录训练营第35天 || 01背包问题 416. 分割等和子集

01背包问题

就是将一些有价值的物品(只能放一次),放入有限容量的背包里,怎么放价值最大。

二维数组方法

动规五部曲:


1.dp数组及下标含义

dp[ i ][ j ]

dp数组表示当前背包容量,当前可放入物品下,最大的背包价值,下标的含义:i是物品,j是背包的递推容量(为什么叫递推容量,因为背包的容量是一点一点在扩大,来推出最终背包的总容量的最大价值),当然也可以颠倒。

2.递推公式:

dp[ i ][ j ] = max( dp[ i-1 ][ j ] ,dp[ i-1 ][j-weight[ i ](表示i物品的重量)+value[i] )

3. dp数组如何初始化

把最左边一列和最上面一行初始化,因为其他的数组元素都是由上一个元素和左上的元素推出来的

左边一列为0,因为此时背包容量为0,上面一列,只能放物品0,要么是0,要么最大就是物品0的价值

4.确定遍历顺序:

遍历顺序:任意顺序都可

5.例举

总结:为什么求一个总背包容量的最大价值要拆分成二维数组,因为最终结果是由小背包容量推出来的

滚动数组方法:

1.dp数组及下标含义

dp [ j ] : j 是为了延续二维数组的方法j的含义,j是背包的容量

2.递推公式:

dp[ j ] = max (dp [ j ] , dp[ j -weight[ i ] ] + value[i] ]

与二维数组不同的是,数组是重复利用的,所有当前数组如果不修改就等效为二维数组时上一层的数组

3. dp数组如何初始化

4.确定遍历顺序:

遍历顺序只能先遍历物品,再遍历背包容量,并且遍历背包容量只能倒序(倒序遍历是为了保证物品i只被放入一次)

5.例举

416. 分割等和子集

思路:

01背包的应用:因为要分割成两个等和的子集,所以把一半的和想象成背包,只要在数组中找到能够装满这个背包的子集就行

代码:

class Solution {
public:bool canPartition(vector<int>& nums) {int sum = 0;vector<int> dp(10001,0);//dp数组的初始化for(int i = 0;i<nums.size();i++)//求和{sum+=nums[i];}if(sum%2==1)return false;//总和必须能一分为二,否则不能一分为二int target = sum/2;//target相当于背包问题的背包总容量for(int i =0;i<nums.size();i++){for(int j = target;j >= nums[i];j--)//为什么从target开始遍历,因为target是背包最大容量{dp[j] =max(dp[j] , dp[j-nums[i]]+nums[i]);//max中的dp[j]是不放入dp当前i物品也就是num[i],dp[j-nums[i]]+nums[i]是放入nums[i]}}if (dp[target] == target)return true;return false;}
};

遇到的问题:

1.对于总和的一半想象成背包总重量的背包问题,并且每个数字本身代表价值和重量

2. for(int j = target;j >= nums[i];j--)//为什么从target开始遍历,因为target是背包最大容量

http://www.xdnf.cn/news/33913.html

相关文章:

  • Vue基础(6)_键盘事件
  • 玛哈特整平机:工业制造中的关键设备
  • Java 动态代理实现
  • Python scikit-learn 机器学习算法实践
  • 【每天一个知识点】模式识别
  • MySQL进阶-存储过程-变量语法结构
  • C++用于保留浮点数的两位小数,使用宏定义方法(可兼容低版本Visual Studio)
  • JZ8P1533 充电型数字可编程控制器
  • 200+短剧出海平台:谁能成为“海外红果”?
  • 电脑端移植至手机平板:攻克难题,仙盟架构显神通——仙盟创梦IDE
  • 2025.04.19-阿里淘天春招算法岗笔试-第二题
  • 在RK3588上使用SRS流媒体服务器
  • kafka集群认证
  • NumPy 核心指南:零基础入门与实践
  • 商标起名换了暗示词,通过初审!
  • 边生成边训练:构建合成数据驱动的在线训练系统设计实战
  • XMind 下载指南
  • 基于autoware.1.14与gazebo联合仿真进行全局规划高精地图版
  • 可穿戴经颅多通道直流电刺激产品测试总结
  • 16、堆基础知识点和priority_queue的模拟实现
  • 为什么 waitress 不支持 WebSocket?
  • PyTorch源码编译报错“fatal error: numpy/arrayobject.h: No such file or directory”
  • SEO长尾关键词优化实战
  • velocity模板引擎
  • 【一起学Rust】使用Thunk工具链实现Rust应用对Windows XP/7的兼容性适配实战
  • RoBoflow数据集的介绍
  • JVM笔记【一】java和Tomcat类加载机制
  • PHP怎样连接MySQL数据库?
  • 基于STM32中断讲解
  • 【JDBC-54.5】JDBC批处理插入数据:大幅提升数据库操作性能