59 分割等和子集

分割等和子集

    • NP 完全问题(01背包)
    • 题解1 二维DP
    • 题解2 空间优化DP(改为1D)

给你一个只包含正整数非空数组 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

NP 完全问题(01背包)

特点是:「每个数只能用一次」。解决的基本思路是:物品一个一个选,容量也一点一点增加去考虑,这一点是「动态规划」的思想

对于「0-1 背包问题」而言就是「当前考虑到的数字选与不选」:

  1. 不选择 nums[i],如果在 [0, i - 1] 这个子区间内已经有一部分元素,使得它们的和为 j ,那么 dp[i][j] = true;
  2. 选择 nums[i],如果在 [0, i - 1] 这个子区间内就得找到一部分元素,使得它们的和为 j - nums[i]。
  3. 状态转移方程为 dp[i][j] = dp[i - 1][j] || dp[i - 1][j - nums[i]]

在这里插入图片描述
注意:观察状态转移方程,or 的结果只要为真,表格 这一列 下面所有的值都为真。

因此在填表的时候,只要表格的最后一列是 true,代码就可以结束,直接返回 true。(题解2)

题解1 二维DP

class Solution {
public:bool canPartition(vector<int>& nums) {int s = nums.size();int sumN = 0;for(auto&k : nums) sumN += k;// 总和不是偶数就不能分割成2 parts了if(sumN % 2) return false;sumN = sumN >> 1;// dp[i][j]: 从[0,i]范围内选取若干个正整数(可以是0个),是否存在一种选取方案使得被选取的正整数的和(物品重量总和)等于j(背包容量)// 如果dp.row = s,则需要设定dp[0][nums[0]]=true;后面的代码逻辑可以保持一致(有i-1)vector<vector<bool>> dp(s+1, vector<bool>(sumN+1, false));// 背包容量为0时 不放入就满足条件    for(int i = 1; i < s; i++){dp[i][0] = true;}for(int i = 1; i <= s; i++){for(int j = 1; j <= sumN; j++){if(j < nums[i-1])// 背包容量不足,不能装dp[i][j] = dp[i-1][j];else// 这样可以把状态传递到最后的元素// 要么装,要么不装(和上一个情况保持一致)dp[i][j] = dp[i-1][j] || dp[i-1][j-nums[i-1]];}}       return dp[s][sumN];}
};

在这里插入图片描述

题解2 空间优化DP(改为1D)

class Solution {
public:bool canPartition(vector<int>& nums) {int s = nums.size();int sumN = 0, maxN = 0;for(auto&k : nums){sumN += k;maxN = max(maxN, k);}if(sumN % 2) return false;sumN = sumN >> 1;// 剪枝if(maxN > sumN) return false;vector<bool> dp(sumN+1, false);dp[0] = true;for(int i = 0; i < s; i++){// 这里注意从大到小计算(保证是前行的意思)for(int j = sumN; j >= nums[i]; j--){// 启发自dp[i][j] = dp[i-1][j] || dp[i-1][j-nums[i-1]];(只与上一行的值有关)dp[j] = dp[j] || dp[j-nums[i]];}// (可能会加速)if(dp[sumN]) return true;}return dp[sumN];}
};

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

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

相关文章

Cdiscount、亚马逊新品不开单怎么办 ?测评自养号关键之处及搭建技巧揭秘

一、Listing如何优化? 一个产品要想有销量&#xff0c;Listing优化必须得做好&#xff0c;这是形成转化产生订单的基础。 有些卖家误以为“反复修改了N次”就叫做“优化”&#xff0c;这绝对是误解 想要做好Listing优化&#xff0c;需要知道优化的基本标准&#xff0c;同时…

私人服务器可以干嘛

目录 搭建个人网站或博客&#xff1a; 远程桌面&#xff1a; 作为网盘储存&#xff1a; 作为测试和学习环境&#xff1a; 推广产品&#xff1a; 游戏私服(注意,仅限于个人自己单机玩)&#xff1a; 个人服务器可以用于多种用途&#xff0c;以下是一些常见的用途&#xff1a;…

【k8s】1、基础概念和架构及组件

一、kubernetes概述 K8S是一种开源的容器编排平台&#xff0c;用于自动化部署、扩展和管理容器化的应用程序&#xff0c;它提供了一种容器编排和管理的方式&#xff0c;可以帮助开发人员更轻松的管理容器化的应用程序&#xff0c;并且提供了一种跨多个主机的自动化部署和管理机…

chrome Driver 使用教程

ChromeDriver是一款实用的chrome浏览器驱动工具,能够用于自动化测试、网络爬虫和操作浏览器,其主要作用是模拟浏览器操作。 ## 下载地址 [Chrome for Testing availability]&#xff08;Chrome for Testing availability&#xff09;

六氟化硫SF6断路器的运行维护、泄漏处理及气体在线监测

一、六氟化硫SF6断路器日常运行维护 1、SF6断路器在运行、检修过程中&#xff0c;一定要遵守《DL/T 639-1997 六氟化硫电气设备运行、试验及检修人员安全防护细则》。   2、运行中的巡视检查包括&#xff1a;  &#xff08;1&#xff09;检查SF6 断路器的外绝缘部分&#xf…

CORE: Cooperative Reconstruction for Multi-Agent Perception 论文阅读

论文连接 CORE: Cooperative Reconstruction for Multi-Agent Perception 0. 摘要 本文提出了 CORE&#xff0c;一种概念简单、有效且通信高效的多智能体协作感知模型。 从合作重建的新颖角度解决了该任务&#xff1a; 合作主体共同提供对环境的更全面的观察整体观察可以作为…

Hive用户中文使用手册系列(二)

命令和 CLI 语言手册命令 命令是 non-SQL statements&#xff0c;例如设置 property 或添加资源。它们可以在 HiveQL 脚本中使用&#xff0c;也可以直接在CLI或Beeline中使用。 命令描述退出使用 quit 或 exit 退出交互式 shell。重启将 configuration 重置为默认值(从 Hive…

【STM32】--PZ6860L,STM32F4,ARM3.0开发板

一、ARM3.0开发板详细介绍 1.开发板整体介绍 &#xff08;1&#xff09;各种外设和主板原理图 &#xff08;2&#xff09;主板供电部分5V和3.3V兼容设计 注意跳线帽 2.STM32核心板介绍 3.核心板原理图 STM32和51的IO对应关系 下载电路 二、ARM3.0开发板ISP下载原理分析 1.I…

Go语言入门心法(六): HTTP面向客户端|服务端编程

Go语言入门心法(一): 基础语法 Go语言入门心法(二): 结构体 Go语言入门心法(三): 接口 Go语言入门心法(四): 异常体系 Go语言入门心法(五): 函数 一:go语言面向web编程认知 Go语言的最大优势在于并发与性能,其性能可以媲美C和C,并发在网络编程中更是至关重要 使用http发送请…

android开源投屏工具scrcpy简介

目录 一&#xff0c;初识scrcpy 1.1 scrcpy介绍 1.2 scrcpy特点 二&#xff0c;scrcpy指令说明 2.1 画面设置 2.1.1 缩小分辨率 2.1.2 修改画面比特率 2.1.3 限制画面帧率 2.1.4 画面裁剪 2.1.5 锁定屏幕朝向 2.2 屏幕录制 2.3 连接方式 2.3.1 无线 2.3.2 多设备…

Ai数字人直播系统SaaS源码大开源,源码独立部署助力中小企业发展!

源码独立部署ai数字人直播系统&#xff0c;如果放在上半年的话没有数百万投资几乎是天方夜谭&#xff0c;连想做个数字人代理商少则投资十万多则数十万才能进得了代理门槛。在此期间&#xff0c;数字人市场一度出现了大批不良企业利用网上下载的视频合成源码二次包装后打着数字…

5.MidBook项目经验之MongoDB,Nacos,网关

1.医院查询接口 //系统1(signsignMD5加密后) ----> 系统2(数据库signMD5加密 相对比),好处在于网络之间传输不会得到直接得到sign 2.上传和删除科室信息 //map转jsonString,然后再转为对象//保存需要查数据库是否存在,存在修改,不存在添加//接口的包引入不对导致调用引包错误…

三级分类部分三级目录无法加载,后端接口能在前端返回所有数据

项目场景&#xff1a; 实现ElementUI中三级分类的功能&#xff0c;发现没有前端三级目录的二级目录可以新建三级目录&#xff0c;数据库中也有数据&#xff0c;但是无法在前端显示&#xff01;后端的接口没有返回数据库的数据。 问题描述 提示&#xff1a;这里描述项目中遇到…

代码随想录算法训练营第五十七天| LeetCode 392 判断子序列、LeetCode 115 不同的子序列

1 LeetCode 392 判断子序列 题目链接&#xff1a;LeetCode 392 判断子序列 文章讲解&#xff1a;代码随想录(programmercarl.com) 视频讲解&#xff1a;动态规划&#xff0c;用相似思路解决复杂问题 | LeetCode&#xff1a;392.判断子序列 2 LeetCode 115 不同的子序列 题目链接…

群狼调研(长沙消费者满意度调查) | 参展观众满意度调查流程

进行参展观众满意度调查需要一个系统化的流程&#xff0c;以确保数据的收集和分析有效、可靠。群狼调研(长沙大学满意度调查)受顾客委托开展参展观众满意度调查&#xff0c;以下是进行参展观众满意度调查的一般流程&#xff1a; 1. 确定调查目标和目的&#xff1a; 明确为何进…

selenium多窗口、多iframe切换、alert、3种等待

1、多标签/多窗口之间的切换 场景&#xff1a; 在页面操作过程中有时候点击某个链接会弹出新的窗口&#xff0c;这时就需要切换到新打开的窗口上进行操作。这种情况下&#xff0c;需要识别多标签或窗口的情况。 操作方法&#xff1a; switch_to.window()方法&#xff1a;切换…

c 语言基础:L1-045 宇宙无敌大招呼

据说所有程序员学习的第一个程序都是在屏幕上输出一句“Hello World”&#xff0c;跟这个世界打个招呼。作为天梯赛中的程序员&#xff0c;你写的程序得高级一点&#xff0c;要能跟任意指定的星球打招呼。 输入格式&#xff1a; 输入在第一行给出一个星球的名字S&#xff0c;是…

【Eclipse】解决插件下载速度太慢

解决方案&#xff1a;修改镜像 下面列出几个国内的镜像网站&#xff1a; 中国科学技术大学(5.6MB/s) http://mirrors.ustc.edu.cn/eclipse/ 北京理工大学&#xff08;600KB/s&#xff09; http://mirror.bit.edu.cn/eclipse/ 大连东软信息学院(400KB/s) http://mirrors.neuso…

Dolphinscheduler的API接口问题

在使用java 调用dolphinscheduler的API接口时要注意的事项&#xff1a; 1&#xff1a;官方文档中写的是使用ui界面创建token&#xff0c;然后将token设置在header中&#xff0c;但是如果没有这个token怎么办&#xff1f;因为在一个陌生的环境中&#xff0c;一般没人会记这个to…

基于YOLOv8的多目标检测与自动标注软件【python源码+PyqtUI界面+exe文件】【深度学习】

基本功能演示 摘要&#xff1a;YOLOv8是YOLO系列最新的版本&#xff0c;支持多种视觉任务。本文基于YOLOv8的基础模型实现了80种类别的目标检测&#xff0c;可以对图片进行批量自动标注&#xff0c;并将检测结果保存为YOLO格式便于后续进行其他任务训练。本文给出完整的Python实…