leetCode 416.分割等和子集 + 01背包 + 动态规划 + 记忆化搜索 + 递推 + 空间优化

关于此题我的往期文章

LeetCode 416.分割等和子集(动态规划【0-1背包问题】采用一维数组dp:滚动数组)_呵呵哒( ̄▽ ̄)"的博客-CSDN博客icon-default.png?t=N7T8https://heheda.blog.csdn.net/article/details/133212716看本期文章时,可以先回顾一下动态规划入门知识和完全背包理论和实战: 

0-1背包 完全背包 + 至多/恰好/至少 + 空间优化 + 常见变形题(实战力扣题)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_41987016/article/details/134210521?spm=1001.2014.3001.5501

leetCode 198.打家劫舍 动态规划入门:从记忆化搜索到递推-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_41987016/article/details/134179583?spm=1001.2014.3001.5501 



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


最优的子结构性质,这是解决动态规划问题的关键。最优解可以从其子问题的最优解构造出来。如何将问题分解成子问题?

(1)递归

  • dfs(i,c) = max(dfs(i-1,c),dfs(i-1,c-nums[i])+nums[i]);
class Solution {
public:// 递归 超出时间限制!bool canPartition(vector<int>& nums) {int n=nums.size(),sum=0;for(const int& x:nums) sum+=x;if(sum % 2 == 1) return false;int left = sum/2; // 目标和function<int(int,int)> dfs=[&](int i,int c) -> int {if(i<0) {if(c==0) return 0;else return INT_MIN;}if(c<nums[i]) return dfs(i-1,c);return max(dfs(i-1,c),dfs(i-1,c-nums[i])+nums[i]);};  int ans = dfs(n-1,left); return ans<0?false:true;}
};

(2)递归搜索 + 保存计算结果 = 记忆化搜索

  • 在递归树中,有许多子问题被多次计算。为了避免重复的计算,可以将每个子问题的答案存在一个数组中进行记忆化,如果下次还要计算这个问题的值直接从数组中取出返回即可,这样能保证每个子问题最多只被计算一次。
class Solution {
public:// 记忆化搜索bool canPartition(vector<int>& nums) {int n=nums.size(),sum=0;for(const int& x:nums) sum+=x;if(sum % 2 == 1) return false; // 如果 sum 为奇数,直接返回 falseint left = sum/2,memo[n+1][left+1]; memset(memo,-1,sizeof(memo));function<int(int,int)> dfs=[&](int i,int c) -> int {if(i<0) {if(c==0) return 0;else return INT_MIN;}int &res = memo[i][c];if(res != -1) return res;if(c<nums[i]) return res=dfs(i-1,c);return res=max(dfs(i-1,c),dfs(i-1,c-nums[i])+nums[i]);};  int ans = dfs(n-1,left); return ans<0?false:true;}
};

(3)1:1 翻译成递推

  • dfs(i,c) = max(dfs(i-1,c),dfs(i-1,c-nums[i])+nums[i]);
  • f[i][c] = max(f[i-1][c]),f[i-1][c-nums[i]+nums[i]);
  • f[i+1][c] = max(f[i][c]),f[i][c-nums[i]+nums[i]);

初始化:根据递归的边界来初始化

if(i<0) {if(c==0) return 0;else return INT_MIN;
}
  • f 数组初始化为 INT_MIN
  • dfs(-1,0) = 0 翻译f[0][0]=0

返回最终结果:根据 dfs(n-1,left) 翻译 f[n][left] 

class Solution {
public: // 递推bool canPartition(vector<int>& nums) {int n=nums.size(),sum=0;for(const int& x:nums) sum+=x;if(sum % 2 == 1) return false; // 如果 sum 为奇数,直接返回 falseint left = sum/2,f[n+1][left+1];memset(f,128,sizeof(f)); // 无穷小f[0][0]=0;for(int i=0;i<n;i++) {for(int c=0;c<=left;c++) {if(c < nums[i]) f[i+1][c] = f[i][c];else f[i+1][c] = max(f[i][c],f[i][c-nums[i]]+nums[i]);}}int ans=f[n][left]; return ans<0 ? false:true;}
};

(4)空间优化:两个数组(滚动数组)

  • f[(i+1)%2][c] = max(f[i%2][c],f[i%2][c-nums[i]]+nums[i]);
class Solution {
public:// 递推 + 优化空间(二维)bool canPartition(vector<int>& nums) {int n=nums.size(),sum=0;for(const int& x:nums) sum+=x;if(sum % 2 == 1) return false; // 如果 sum 为奇数,直接返回 falseint left = sum/2,f[2][left+1];memset(f,128,sizeof(f)); // 无穷小f[0][0]=0;for(int i=0;i<n;i++) {for(int c=0;c<=left;c++) {if(c < nums[i]) f[(i+1)%2][c] = f[i%2][c];else f[(i+1)%2][c] = max(f[i%2][c],f[i%2][c-nums[i]]+nums[i]);}}int ans=f[n%2][left]; return ans<0 ? false:true;}
};

(5)空间优化:一个数组

  • f[i+1][c] = max(f[i][c]),f[i][c-nums[i]+nums[i]);
  • f[c] = max(f[c],f[c-nums[i]]+nums[i]);
class Solution {
public:// 递推 + 优化空间(一维)bool canPartition(vector<int>& nums) {int n=nums.size(),sum=0;for(const int& x:nums) sum+=x;if(sum % 2 == 1) return false; // 如果 sum 为奇数,直接返回 falseint left = sum/2,f[left+1];memset(f,128,sizeof(f)); // 无穷小f[0]=0;for(int i=0;i<n;i++) {for(int c=left;c>=nums[i];c--) {f[c] = max(f[c],f[c-nums[i]]+nums[i]);}}int ans=f[left]; return ans<0 ? false:true;}
};可以改成
for(const int& x:nums) {for(int c=left;c>=x;c--) {f[c] = max(f[c],f[c-x]+x);}
}

参考和推荐文章:

利用memset 赋值无穷大和无穷小_如何使用memset函数初始化数组的值为无穷小_Prudento的博客-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/Prudento/article/details/123534212416. 分割等和子集 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/partition-equal-subset-sum/solutions/442412/shou-hua-tu-jie-fen-ge-deng-he-zi-ji-dfshui-su-si-/

常用技巧: 

memset(a,127,sizeof(a));
即得到无穷大。
memset(a,128,sizeof(a));
即得到无穷小,与上述的值互为相反数。
memset(a,60,sizeof(a));
即近似为第一个式子的数值的一半。
memset(a,0,sizeof(a));赋值0
memset(a,-1,sizeof(a));赋值-1
上述例子对于a数组为int或long long时,成立。memset( , 0x3f , sizeof );
特意去试了下,发现 0x3f3f3f3f 真的是个非常精巧的常量来自这篇博客:https://blog.csdn.net/Prudento/article/details/123534212

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

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

相关文章

关于JADX和JEB的小问题

关于JADX和JEB的小问题 很久没水过技术文啦&#xff0c;最近也刚好遇到点小问题&#xff0c;特此记录 第一个问题 在处理app加密逻辑的时候一直拿不到正确的密文&#xff0c;反复看了反编译出来的代码&#xff08;如下图&#xff09; public static string n(String str, Stri…

基础课22——云服务(SaaS、Pass、laas、AIaas)

1.云服务概念和类型 云服务是一种基于互联网的计算模式&#xff0c;通过云计算技术将计算、存储、网络等资源以服务的形式提供给用户&#xff0c;用户可以通过网络按需使用这些资源&#xff0c;无需购买、安装和维护硬件设备。云服务具有灵活扩展、按需使用、随时随地访问等优…

linux 查看当前目录下每个文件夹大小

要在 Linux 中查看当前目录下每个文件夹的大小&#xff0c;可以使用 du 命令&#xff08;磁盘使用情况&#xff09;结合其他一些选项。下面是几个常用的命令示例&#xff1a; 显示当前目录下每个文件夹的大小——只显示一层文件夹&#xff1a; du -h --max-depth1该命令会以人…

2023年内衣行业分析:京东大数据平台-服饰内衣市场解析

如今&#xff0c;女性消费力的提升正在推动国内女性内衣市场份额逐年提升。而今年&#xff0c;内衣市场更是进入了存量之战&#xff0c;增长趋势明显减弱。 根据鲸参谋数据显示&#xff0c;今年1月至9月&#xff0c;京东平台内衣&#xff08;文胸&#xff09;累计销量约500万件…

【数智化案例展】某国际高端酒店品牌——呼叫中心培训数智化转型项目

‍ 维音案例 本项目案例由维音投递并参与数据猿与上海大数据联盟联合推出的《2023中国数智化转型升级创新服务企业》榜单/奖项”评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 培训是呼叫中心管理的重要环节&#xff0c;由于员工流动性强、培训需求多样、考核流程繁琐…

2003 - Can‘t connect to MysQL server on ‘39.108.169.0‘ (10060 “Unknown error“)

问题描述 某天和往常一样启动java项目&#xff0c;发现数据库出问题了&#xff0c;然后打开navicat&#xff0c;发现数据库的链接都连接不上&#xff0c; 一点击就会弹出报错框&#xff1a; 然后就各种上网搜索。 解决方案 上网查了一些解决方案&#xff0c;大部分都是说看…

hivesql,sql 函数总结:

1、NVL函数与Coalesce差异 -- select nvl(null,8); -- 结果是 8 -- select nvl(,7); -- 结果是"" -- select coalesce(null,null,9); -- 结果是 9 -- select coalesce("",null,9); -- 结果是 "" 1.2、 NVL函数与Coalesce差异 …

DB-GPT介绍

DB-GPT介绍 引言DB-GPT项目简介DB-GPT架构关键特性私域问答&数据处理多数据源&可视化自动化微调Multi-Agents&Plugins多模型支持与管理隐私安全支持数据源 子模块DB-GPT-Hub微调参考文献 引言 随着数据量的不断增长和数据分析的需求日益增多&#xff0c;将自然语言…

Technology strategy Pattern 学习笔记4 - Creating the Strategy-Corporate Context

Creating the Strategy-Corporate Context 1 •. Stakeholder Alignment 1.1 要成功&#xff0c;要尽可能获得powerful leader的支持 1.2 也需要获得最高执行层的支持 1.3 Determining&#xff08;确定&#xff09; Stakeholders 需要建立360度组织图&#xff0c;确认三类人…

基于深度学习的目标检测算法 计算机竞赛

文章目录 1 简介2 目标检测概念3 目标分类、定位、检测示例4 传统目标检测5 两类目标检测算法5.1 相关研究5.1.1 选择性搜索5.1.2 OverFeat 5.2 基于区域提名的方法5.2.1 R-CNN5.2.2 SPP-net5.2.3 Fast R-CNN 5.3 端到端的方法YOLOSSD 6 人体检测结果7 最后 1 简介 &#x1f5…

适用于 Linux 的 WPF:Avalonia

许多年前&#xff0c;在 WPF 成为“Windows Presentation Foundation”并将 XAML 作为 .NET、Windows 等的 UI 标记语言引入之前&#xff0c;有一个代号为“Avalon”的项目。Avalon 是 WPF 的代号。XAML 现在无处不在&#xff0c;XAML 标准是一个词汇规范。 Avalonia 是一个开…

EtherCAT主站写从站EEPROM抓包分析

0 工具准备 1.EtherCAT主站 2.EtherCAT从站&#xff08;本文使用步进电机驱动器&#xff09; 3.Wireshark1 抓包分析 1.1 报文总览 本文主站设置从站1字地址为0的EEPROM数据为0x3C00&#xff08;设置完毕后请还原字0的EEPROM数据&#xff09;&#xff0c;使用Wireshark抓取到…

Day 6 登录页以及路由(四)Vue页面处理

系列文章目录 本系列记录一下通过Abp搭建后端&#xff0c;VueElement UI Plus搭建前端&#xff0c;实现一个小型项目的过程。 Day 1 Vue 页面框架Day 2 Abp框架下&#xff0c;MySQL数据迁移时&#xff0c;添加表和字段注释Day 3 登录页以及路由 (一&#xff09;Day 4 登录页及…

CleanMyMac X2024破解版下载地址链接

如果你是一位Mac用户&#xff0c;你可能会遇到一些问题&#xff0c;比如Mac运行缓慢、磁盘空间不足、应用程序难以管理等。这些问题会影响你的Mac的性能和体验&#xff0c;让你感到沮丧和无奈。那么&#xff0c;有没有一款软件可以帮助你解决这些问题呢&#xff1f;答案是肯定的…

(免费领源码)Java#Springboot#mysql高校实训管理平台01557-计算机毕业设计项目选题推荐

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文结构与章节安排 2 高校实训管理平台系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系…

「图像 cv2.seamlessClone」无中生有制造数据

上一篇博客【「图像 merge」无中生有制造数据 】写的是图片直接融合&#xff0c;此方法生成的图片相对而言比较生硬&#xff0c;虽然目标图片已经透明化处理过了&#xff0c;但是生成的图片依旧很假 除了上述上述的图片叠加融合之外&#xff0c;还有一种更加自然的融合方法&…

Nginx+keepalived实现七层的负载均衡

1.keepalived VRRP 介绍 keepalived是什么&#xff1f; keepalived是集群管理中保证集群高可用的一个服务软件&#xff0c;用来防止单点故障。 keepalived工作原理 keepalived是以VRRP协议为实现基础的&#xff0c;VRRP全称Virtual Router Redundancy Protocol&…

C#使用Oracle.ManagedDataAccess.dll

1、添加引用 在网上下载一个Oracle.ManagedDataAccess.dll&#xff0c;引用即可&#xff0c;操作不受操作系统的位数限制&#xff0c;服务器也不Oracle客户端&#xff1b; 2、web.config字串 <appSettings> <add key"hrp" value"Data Source (DES…

ElasticSearch基本使用

概述 安装 关于ES的安装不做重点讲解&#xff0c;这里提供一个k8s基于sts创建以及ingress访问的模板文件。 --- apiVersion: apps/v1 kind: StatefulSet metadata:labels:app: elasticsearchcomponent: masterrelease: elasticsearchname: elasticsearch-masternamespace: es s…

「Verilog学习笔记」移位运算与乘法

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 分析 1、在硬件中进行乘除法运算是比较消耗资源的一种方法&#xff0c;想要在不影响延迟并尽量减少资源消耗&#xff0c;必须从硬件的特点上进行设计。根据寄存器的原理&a…