动态规划01背包之416分割等和子集(第10道)

题目:

给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。

示例:

解法:

先复习一下01背包问题:

dp[i][j]的含义:从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少。

那么可以有两个方向推出来dp[i][j]:

不放物品i:由dp[i - 1][j]推出,即背包容量为j,里面不放物品i的最大价值,此时dp[i][j]就是dp[i - 1][j]。(其实就是当物品i的重量大于背包j的重量时,物品i无法放进背包中,所以背包内的价值依然和前面相同。)

放物品i:由dp[i - 1][j - weight[i]]推出,dp[i - 1][j - weight[i]] 为背包容量为j - weight[i]的时候不放物品i的最大价值,那么dp[i - 1][j - weight[i]] + value[i] (物品i的价值),就是背包放物品i得到的最大价值。

所以递归公式: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]) ;

只有确定了如下四点,才能把01背包问题套到本题上来。

(1)背包的最大体积为bagweight=sum / 2,背包可放入的商品个数为n = nums.size()。

(2)背包要放入的商品(集合里的元素)体积为 元素的数值,价值也为元素的数值。

(3)背包如果正好装满,说明找到了总和为 sum / 2 的子集。

(4)背包中每一个元素是不可重复放入。

二维dp法:
class Solution {
public:bool canPartition(vector<int>& nums) {/**1. dp数组含义:dp[i][j]为背包重量为j时,从[0到i]元素和最大值2. 递推公式:dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - nums[i]] + nums[i])3. 初始化: (1)dp[i][0]初始化为0。因为背包重量为0时,不可能放入元素。(2)dp[0][j] = nums[0],当j >= nums[0] && j < bagWeight时4. 遍历顺序:先遍历物品,再遍历背包*/int n=nums.size();//背包的物品个数/* nums大小判断 */if(n < 2) return false;int sum=0;int bagWeight = 0;for(int i=0;i<n;i++){sum += nums[i];}if(sum % 2 == 1) return false;//数组和是奇数bagWeight=sum/2;//背包容量vector<vector<int>> dp(n,vector<int>(bagWight+1,0));//初始化//(1)背包重量为0时,不可能放入元素for (int i = 0 ; i < nums.size(); i++) {  // 当然这一步,如果把dp数组预先初始化为0了,这一步就可以省略,但很多同学应该没有想清楚这一点。dp[i][0] = 0;}for (int j = nums[0]; j <= bagWeight; j++) {dp[0][j] = nums[0];}for(int i=1;i<n;i++){for(int j=0;j<=bagWeight;j++){if (j <nums[i]) dp[i][j] = dp[i - 1][j];else dp[i][j]=max(dp[i - 1][j],dp[i-1][j-nums[i]]+nums[i]);}}if (dp[n-1][bagWeight] == bagWeight) return true;  return false;}
};
一维dp法:
class Solution {
public:bool canPartition(vector<int>& nums) {int sum = 0;for (int i = 0; i < nums.size(); i++) {sum += nums[i];}int bagweight = sum / 2;//背包重量为bagweightvector<int> dp(bagweight+1, 0);//初始化:从0到bagweight个行// 也可以使用库函数一步求和// int sum = accumulate(nums.begin(), nums.end(), 0);if (sum % 2 == 1) return false;// 开始 01背包for(int i = 0; i < nums.size(); i++) {for(int j = bagweight; j >= nums[i]; j--) { // 每一个元素一定是不可重复放入,所以从大到小遍历dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);}}// 集合中的元素正好可以凑成总和bagweightif (dp[bagweight] == bagweight) return true;return false;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/606.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux->初识计算机网络

目录 前言&#xff1a; 1 网络发展背景 2 协议 2.1 网络协议初识 2.2 协议分层 2.3 OSI、TCP/IP层状模型 2.4 协议和操作系统的关系 2.5 根据协议栈的通信 3 网络中的地址管理 前言&#xff1a; 本篇当中没有任何关于网络编程的讲解&#xff0c;全部是对网络的宏观理解…

【数学建模】 灰色预测模型

数学建模——预测模型简介 https://www.cnblogs.com/somedayLi/p/9542835.html 灰色预测模型 https://blog.csdn.net/qq_39798423/article/details/89283000?ops_request_misc&request_id&biz_id102&utm_term%E7%81%B0%E8%89%B2%E9%A2%84%E6%B5%8B%E6%A8%…

Mysql数据库备份、索引、视图

目录 备份&#xff1a;先创建如下数据库和表 1、使用mysqldump命令备份数据库中的所有表 2、备份booksDB数据库中的books表 3、使用mysqldump备份booksDB和test数据库 4、使用mysqldump备份服务器中的所有数据库 5、使用mysql命令还原第二题导出的book表 6、进入数据库使…

Jenkins Pipline使用SonarScanner 检查 VUE、js 项目 中遇到的Bug

在 Jenkins 上使用 Pipline 进行集成&#xff0c;利用 SonarScanner 做静态代码扫描的过程中&#xff0c;遇到了几个问题&#xff0c;这里记录了一点解决办法。 在Jenkins上使用Pipline进行集成&#xff0c;利用SonarScanner做静态代码扫描的过程中&#xff0c;遇到了几个问题&…

MySQL 进阶之王,MySql 性能实战源码 + 笔记 + 项目实战

随着互联网时代的兴起&#xff0c;MySQL 在数据库领域日益显现出举足轻重的地位&#xff0c;它不断扩大的用户群体就是很好的证明。在这样的背景下&#xff0c;需要越来越多的人在知识资源方面为之付出&#xff0c;将自己对 MySQL 数据库的学习过程、运维经验、个人理解等记录下…

scripy其他

持久化 # 爬回来&#xff0c;解析完了&#xff0c;想存储&#xff0c;有两种方案 ## 方案一&#xff1a;一般不用 parse必须有return值&#xff0c;必须是列表套字典形式--->使用命令&#xff0c;可以保存到json格式中&#xff0c;csv中scrapy crawl cnblogs -o cnbogs.j…

生活的意义

当前在工作中&#xff0c;但是有30分钟的等待时间&#xff0c;不知道要说点什么&#xff0c;突然想到了&#xff1a;人生的意义&#xff01;本人的一个小小的思考。由于话题太过敏感 标题就写了 "生活的意义" 每天上班日复一日&#xff0c;没有爱好。生活中除了日常…

Web3 开发指南:使用 NFTScan NFT API 构建一个 NFT 链上追踪器

对于大多数 Web3 团队来说&#xff0c;构建一个完整的链上 NFT 数据追踪系统是一项具有挑战性的任务&#xff0c;构建一个 NFT 链上追踪器更是如此。涉及到处理区块链上的智能合约和交易数据&#xff0c;并将其与外部数据源进行整合和分析工作量是十分巨大的&#xff1a; 区块链…

http请求状态码汇总

目录 常见的状态码 所有状态码汇总 1xx——临时响应信息提示&#xff1b;这些状态代码表示临时的响应。客户端在收到常规响应之前&#xff0c;应准备接收一个或多个1xx 2xx——成功 3xx——重定向&#xff1a;表示要完成请求&#xff0c;需要进一步操作。通常&#xff0c;…

《重构》:Consolidate Conditional Expression

重点看一下&#xff1a;逻辑与&#xff0c;出现多层if嵌套的情况 实际开发中&#xff0c;与门应该是最容易也是最应该被优化的。 合并后的条件代码会表述“实际上只有一次条件检查&#xff0c;只不过有多个并列条件需要检查&#xff0c;从而使这一次检查的用意更清晰。当然&am…

13. Mysql基本操作以及语法

1 数据库基础 1.1 数据库概念和术语 数据库是用于存储和管理数据的系统。它由一组相关数据的集合和用于访问、管理和操作这些数据的软件组成。数据库概念和术语包括以下内容&#xff1a; 数据库管理系统&#xff08;Database Management System&#xff0c;DBMS&#xff09;…

RocketMQ学习笔记(实操篇)

目录 基本操作 启动 测试 双主双从集群搭建 总体架构 工作流程 服务器环境 Host添加信息 防火墙配置 环境变量配置 创建消息存储路径 broker配置文件 修改启动脚本文件 服务启动 查看进程状态 查看日志 mqadmin管理工具 使用方式 命令介绍 集群监控平台搭…

基于深度学习的高精度刀具检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度刀具检测识别系统可用于日常生活中或野外来检测与定位刀具目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的刀具目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型…

HTML <meta> 标签

定义和用法 <meta> 元素可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词。 <meta> 标签位于文档的头部,不包含任何内容。<meta> 标签的属性定义了与文档相关联的名称/值对。 浏览器支持 元素ChromeIEFirefoxSafa…

HOT67-寻找旋转排序数组中的最小值

leetcode原题链接&#xff1a;寻找旋转排序数组中的最小值 题目描述 已知一个长度为 n 的数组&#xff0c;预先按照升序排列&#xff0c;经由 1 到 n 次 旋转 后&#xff0c;得到输入数组。例如&#xff0c;原数组 nums [0,1,2,4,5,6,7] 在变化后可能得到&#xff1a; 若旋转…

谈谈——互联网生活中的隐私保护

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

图形编辑器开发:参考线吸附功能,让图形自动对齐

最近我给图形编辑器增加了参照线吸附功能&#xff0c;讲讲我的实现思路。 我正在开发的图形设计工具&#xff1a; https://github.com/F-star/suika 线上体验&#xff1a; https://blog.fstars.wang/app/suika/ 效果是被移动的图形会参考周围图形&#xff0c;自动与它们进行吸附…

MySQl数据库第八课-------SQL命令查询-------主要命脉

作者前言 欢迎小可爱们前来借鉴我的gtiee秦老大大 (qin-laoda) - Gitee.com —————————————————————————————— 目录 查询数据 条件 逻辑运算符 模糊查询 范围查询 in 判断空 UNION 排序 聚合 分组&#xff1a;group by —————————…

c++计算贝塞尔曲线(折线平滑为曲线)坐标方法

效果可查看上一篇博文&#xff1a;js手动画平滑曲线&#xff0c;贝塞尔曲线拟合【代码】js手动画平滑曲线&#xff0c;贝塞尔曲线拟合。https://blog.csdn.net/qiufeng_xinqing/article/details/131711963?spm1001.2014.3001.5502 代码如下&#xff1a; #include <cmath&…