Leetcode 416 分割等和子集

题意理解

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

        即将数组的元素分成两组,每组数值=sum(nums)/2

        若能分成这样的两组,则返回true,否则返回false

        本质上,可以将这道题抽象为0-1背包问题,其中nums中的元素是物品,价值=元素大小,重量=元素大小。背包大小m=sum(nums)/2。

        问题就转换成,将nums中的物品任取,放入大小为m的背包,如果此时背包的最大价值也是m,则返回true, 否则返回false。

解题思路

        首先理解题意,将其转换为一个背包问题,使用动态规划的思路来求解。

        动态规划五部曲:

        (1)dp[i][j]或dp[i]的含义

        (2)递推公式:

                dp[i][j]=max(dp[i-1][j],dp[i-1][j-weight[i]]+values[i])或

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

        (3)根据题意初始化

        (4)遍历求解:先遍历包还是先遍历物品

        (5)打印——debug

1.动态规划二维dp数组

  1. dp[i][j]表示下标[0,j]的元素任务,放入大小为j的背包,能获得的最大价值
  2. 递推公式dp[i][j]=max(dp[i-1][j],dp[i-1][j-weight[i]]+values[i])
  3. 初始化第一行,第一列。
  4. 遍历:由于二维数组完整保留了两个维度所有信息,所以先遍历背包还是先遍历物品,都是可以的。
 public boolean canPartition(int[] nums) {int sum = 0;for(int i=0;i< nums.length;i++) sum+=nums[i];//不能分为两个相等的正整数if(sum%2!=0) return false;int target=(int)sum/2;int[][] dp=new int[nums.length][target+1];for(int i=0;i< nums.length;i++) Arrays.fill(dp[i],-1);for(int i=0;i< nums.length;i++) dp[i][0]=0;for(int j=0;j<=target;j++){if(nums[0]<=j) dp[0][j]=nums[0];else dp[0][j]=0;}for(int i=1;i<nums.length;i++){for(int j=1;j<=target;j++){if(nums[i]>j){dp[i][j]=dp[i-1][j];}else{dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-nums[i]]+nums[i]);}}}return dp[nums.length-1][target]==target?true:false;}

2.一维滚动数组——存储压缩

  1. dp[j]表示装满大小为j的背包所能获得的最大价值。
  2. 递推公式:dp[j]=max(dp[j],dp[j-weight[i]]+values[i])
  3. 初始化:右边的值总是由最左边的值推导而来,而最坐标的值dp[0]表示背包大小为0所能获得的最大价值,所以有dp[0]=0.将所有元素初始化为0
  4. 遍历:由于以为滚动数组是二维dp数组的动态行滚动更新,所以遍历顺序总是先物品后背包。
  5. 注意:为了防止用同层修改过的值修改本行其他值,导致物体重复放置,故采用倒序遍历背包。
public boolean canPartition2(int[] nums) {int sum = 0;for(int i=0;i< nums.length;i++) sum+=nums[i];//不能分为两个相等的正整数if(sum%2!=0) return false;int target=(int)sum/2;int[] dp=new int[target+1];Arrays.fill(dp,0);for(int i=1;i<nums.length;i++){for(int j=target;j>=0;j--){if(nums[i]>j){dp[j]=dp[j];}else{dp[j]=Math.max(dp[j],dp[j-nums[i]]+nums[i]);}}}return dp[target]==target?true:false;}

3.分析

时间复杂度:O(n*target)

空间复杂度

        二维:O(n*target)

        一维:O(target)

n是nums的长度,target是sum(nums)/2的大小

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

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

相关文章

EasyExcel简单实例

EasyExcel简单实例 准备工作场景一&#xff1a;读取 Student 表需求1&#xff1a;简单读取需求2&#xff1a;读取到异常信息时不中断需求3&#xff1a;读取所有的sheet工作表需求4&#xff1a;读取指定的sheet工作表需求5&#xff1a;从指定的行开始读取 场景二&#xff1a;写入…

【方差分析原理简介】

文章目录 方差分析&#xff08;Analysis of Variance&#xff0c;简称ANOVA&#xff09;1 方差分析流程2 借助sklean进行基于方差分析的特征筛选3 总结 方差分析&#xff08;Analysis of Variance&#xff0c;简称ANOVA&#xff09; 卡方检验更多的会考虑在衡量两个离散变量是…

大数据系列之:腾讯云服务器性能和价格比较

大数据系列之&#xff1a;腾讯云服务器性能和价格比较 一、磁盘性能和价格比较二、高性能云硬盘三、ssd云硬盘四、极速型ssd云硬盘五、增强型ssd云硬盘六、查看腾讯云服务器价格 一、磁盘性能和价格比较 磁盘名称高性能ssd云硬盘极速型ssd云硬盘增强型ssd云硬盘规格500g 5800 …

Linux 常用进阶指令

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 其他…

有哪些好用的防蓝光护眼台灯?防蓝光护眼灯品牌排行揭晓

对于大多数人来说&#xff0c;护眼灯已经不是什么新鲜概念。为什么要买护眼灯&#xff1f;相信很多人的回答都是“为了孩子”。为了保护儿童视力健康&#xff0c;越来越多家长选择为孩子购买一台护眼灯&#xff0c;也造就了这个相当具有中国特色的庞大市场。很多家长不放心台灯…

世微 AP5191 降压恒流LED车灯 12-80V 9V5A电源驱动方案

AP5191是一款PWM工作模式,高效率、外围简 单、内置功率MOS管&#xff0c;适用于4.5-150V输入的高 精度降压LED恒流驱动芯片。输出功率150W&#xff0c; 电流6A。 AP5191可实现线性调光和PWM调光&#xff0c;线性调 光脚有效电压范围0.55-2.6V. AP5191 工作频率可以通过RT 外部…

ManageEngine推出Log360双层威胁检测系统,强化SOC精准检测!

ManageEngine推出业界首个双层威胁检测系统&#xff0c;加强其安全信息与事件管理&#xff08;SIEM&#xff09;解决方案Log360&#xff0c;以实现精准和准确的威胁检测。Log360的威胁检测、调查和响应&#xff08;TDIR&#xff09;组件Vigil IQ中的新功能为组织的安全运营中心…

基于 Spring Boot 支付宝沙箱支付(Java 版本)

基于 Spring Boot 支付宝沙箱支付&#xff08;Java 版本&#xff09; 步骤第一步&#xff1a;使用支付宝账户登录&#xff0c;打开控制台&#xff0c;进入沙箱环境第二步&#xff1a;配置内网穿透账号第三步&#xff1a;引入支付宝 SDK第四步&#xff1a; 配置 SpringBoot第五步…

P1563 [NOIP2016 提高组] 玩具谜题————C++

目录 [NOIP2016 提高组] 玩具谜题题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示 解题思路Code运行结果 [NOIP2016 提高组] 玩具谜题 题目背景 NOIP2016 提高组 D1T1 题目描述 小南有一套可爱的玩具小人&#xff0c;它…

自动化测试框架pytest系列之强大的fixture功能,为什么fixture强大?一文拆解它的功能参数。(三)

自动化测试框架pytest系列之基础概念介绍(一)-CSDN博客 自动化测试框架pytest系列之21个命令行参数介绍(二)-CSDN博客 接上两篇文章继续 &#xff1a; 3.3 pytest支持的初始化和清除函数 学过unittest的都知道 &#xff0c;unittest有四个函数 &#xff0c;分别是 &#xff…

git修改历史提交(commit)信息

一、修改最近一次commit信息 1、首先通过git log查看commit信息 2、使用命令git commit --amend进入命令命令模式&#xff0c;按i进入编辑模式&#xff0c;修改好commit信息后按Esc键退出编辑模式&#xff0c;然后输入:wq保存编辑信息&#xff08;注意使用英文输入法&#xf…

如何保护linux服务器远程使用的安全

服务器安全是一个非常敏感的问题&#xff0c;因服务器远程入侵导致数据丢失的安全问题频频出现&#xff0c;一旦服务器入侵就会对个人和企业造成巨大的损失。因此&#xff0c;在日常使用服务器的时候&#xff0c;我们需要采取一些安全措施来保障服务器的安全性。 目前服务器系…