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

【0-1背包】力扣416. 分割等和子集

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

示例 1:
输入:nums = [1,5,11,5]
输出:true
解释:数组可以分割成 [1, 5, 5] 和 [11] 。

示例 2:
输入:nums = [1,2,3,5]
输出:false
解释:数组不能分割成两个元素和相等的子集。

提示:
1 <= nums.length <= 200
1 <= nums[i] <= 100

动态规划

class Solution {
public:bool canPartition(vector<int>& nums) {int n = nums.size();if(n < 2){return false;}int sum = 0;int maxNum = 0;for(int i = 0; i < n; i++){sum += nums[i];maxNum = max(maxNum, nums[i]);}if(sum & 1){return false;}int target = sum / 2;if(maxNum > target){return false;}vector<int> dp(target + 1, 0);dp[0] = true;for(int i = 0; i < n; i++){for(int j = target;j >= nums[i]; j--){dp[j] |= dp[j-nums[i]];}}return dp[target];}
};

首先先判断数组可以被分割成等和子集的必要特征,当数组大小小于2的时候,返回false。接着计算出总和sum和最大的元素maxNum,当sum是奇数的时候,返回false,当最大元素大于sum / 2的时候,也返回false。

  dp[j] |= dp[j-nums[i]];

使用或运算,dp[j] 中的 j 代表的是当前要检查的子集和,也就是在给定的数组中,是否可以找到一个子集,使得这个子集的元素和等于 j。

在遍历数组 nums 时,对于每个元素 nums[i],我们从 target 开始逆序遍历到 nums[i],并更新 dp[j]:

例如,当我们处理 nums[i] = 5 时:
我们会检查 dp[11] 是否可以由 dp[11-5] 转化而来,即 dp[6] 如果为 true,那么 dp[11] 也可以变为 true。类似地,dp[6] 可以由 dp[6-5] = dp[1] 转化而来。通过这种方式,dp[j] 会被不断更新,最终 dp[target] 如果为 true,说明存在一个子集和等于 target。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 大模型本地化部署2-Docker部署MaxKB
  • Unity(2022.3.41LTS) - 网格,纹理,材质
  • Clickhouse集群化(三)集群化部署
  • 云计算day32
  • Windows系统安装MySQL
  • 2024 Ollama 一站式解决在Windows系统安装、使用、定制服务与实战案例
  • 线性代数:如何由AB=E 推出 BA=AB?
  • 【有来开源组织】开发规范手册
  • 【开端】 进行页面升级或维护时不影响用户体验NGINX配置
  • 影像设备国产替代究竟有多重要?这家企业提前布局8K时代
  • object.defineProperty用法
  • 开放式耳机的优缺点有什么?本文为你讲解推荐一下!
  • encodeURI 确保特殊字符能够正确传输
  • 告别手动记录,音频转文字软件助力会议记录新高度
  • 【Android 设备上的所有相关 WiFi 命令和使用方法】
  • .pyc 想到的一些问题
  • 【Leetcode】104. 二叉树的最大深度
  • angular2开源库收集
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • CAP 一致性协议及应用解析
  • crontab执行失败的多种原因
  • ES2017异步函数现已正式可用
  • Java 多线程编程之:notify 和 wait 用法
  • Javascript基础之Array数组API
  • Java小白进阶笔记(3)-初级面向对象
  • js中forEach回调同异步问题
  • Spring Boot快速入门(一):Hello Spring Boot
  • SQLServer之创建显式事务
  • uni-app项目数字滚动
  • vue-cli在webpack的配置文件探究
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 创建一种深思熟虑的文化
  • 浮动相关
  • 利用jquery编写加法运算验证码
  • 前端路由实现-history
  • 前端面试之闭包
  • 十年未变!安全,谁之责?(下)
  • 使用docker-compose进行多节点部署
  • 双管齐下,VMware的容器新战略
  • 我建了一个叫Hello World的项目
  • 小程序button引导用户授权
  • # Apache SeaTunnel 究竟是什么?
  • # 消息中间件 RocketMQ 高级功能和源码分析(七)
  • #NOIP 2014#Day.2 T3 解方程
  • #WEB前端(HTML属性)
  • #微信小程序:微信小程序常见的配置传旨
  • (1)虚拟机的安装与使用,linux系统安装
  • (20)docke容器
  • (Java入门)学生管理系统
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (十一)手动添加用户和文件的特殊权限
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • *ST京蓝入股力合节能 着力绿色智慧城市服务