leetcode hot100 分割等和子集

在这里插入图片描述
在本题中,我们是要把一个数组,分割成两个子集,并且两个子集的元素和相等。那么也就是说,两个子集的和是相等的,并且都是整个数组的一半。那我们考虑这是一个01背包问题,物品的价值和物品的质量一样,就是数组的元素。我们把这个数组的元素放入容量为数组和一半的背包中,如果能刚好放下,则证明可以分割,如果不可以,则证明分割不了。所以我们采用动态规划来做。

抽象成背包问题之后,直接套用背包公式的模板。本题采用一维数组来做。
dp[j]表示容量为j的背包它的价值为dp[j]。

递推公式就是dp[j] = Math.max(dp[j],dp[j-weight[i]+values[i]])。此时weight[]与values[]都一样,就是nums[]

初始化我们要考虑,我们取的是最大值,也就是每次递推,我们取两个元素的最大值,dp[0]表示容量为0,此时价值也为0;其他位置,我们也取0即可,在正整数取最大值的时候可以直接覆盖。

遍历顺序:01背包一维数组遍历顺序应该先遍历物品,再遍历背包,并且背包需要倒叙遍历。

遍历数组

class Solution {public boolean canPartition(int[] nums) {if(nums == null || nums.length == 0) return false;int n = nums.length;int sum = 0;for(int num : nums) {sum += num;}//总和为奇数,不能平分if(sum % 2 != 0) return false;int target = sum / 2;int[] dp = new int[target + 1];for(int i = 0; i < n; i++) {for(int j = target; j >= nums[i]; j--) {//物品 i 的重量是 nums[i],其价值也是 nums[i]dp[j] = Math.max(dp[j], dp[j - nums[i]] + nums[i]);}//剪枝一下,每一次完成內層的for-loop,立即檢查是否dp[target] == target,優化時間複雜度(26ms -> 20ms)if(dp[target] == target)return true;}return false;}
}

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

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

相关文章

C++11---(3)

目录 一、可变参数模板 1.1、可变参数模板的概念 1.2、可变参数模板的定义方式 1.3、如何获取可变参数 二、lambda表达式 2.1、Lamabda表达式定义 2.2、为什么有Lambda 2.3、Lambda表达式的用法 2.4、函数对象与lambda表达式 三、包装器 3.1、function 3.2、bind …

Elasticsearch:什么是 kNN?

kNN - K-nearest neighbor 定义 kNN&#xff08;即 k 最近邻算法&#xff09;是一种机器学习算法&#xff0c;它使用邻近度将一个数据点与其训练并记忆的一组数据进行比较以进行预测。 这种基于实例的学习为 kNN 提供了 “惰性学习&#xff08;lazy learning&#xff09;” 名…

做人力RPO项目需要注意哪些问题?

在当今激烈的商业环境中&#xff0c;企业对人才的需求愈发迫切&#xff0c;人力RPO(招聘流程外包)应运而生。作为一种创新的招聘模式&#xff0c;人力RPO被认为是蓝海项目&#xff0c;拥有广阔的市场前景和巨大潜力。本文将为您揭示做人力RPO市场的关键策略。 一、专业团队&…

用记事本写Java

本篇文章将会用hello word的例子来教大家如何使用记事本写java 1.创建一个txt文件 2.输入代码 public class HelloWorld{public static void main(String[] args){System.out.println("Hello World");} } 3.将文件名后缀由txt改为java 如果不能直接改后缀 打开…

力扣题目训练(17)

2024年2月10日力扣题目训练 2024年2月10日力扣题目训练551. 学生出勤记录 I557. 反转字符串中的单词 III559. N 叉树的最大深度241. 为运算表达式设计优先级260. 只出现一次的数字 III126. 单词接龙 II 2024年2月10日力扣题目训练 2024年2月10日第十七天编程训练&#xff0c;今…

ffmpeg for android编译全过程与遇到的问题

编译前准备 编译环境&#xff1a;Ubuntu16&#xff0c;可自行下载VMWare最新版并百度永久许可证或在服务器上安装Ubuntu ffmpeg源码&#xff1a;ffmpeg4.2.2 NDK下载&#xff1a;Android NDK r21e 有条件的最好还是在Liunx平台下编译吧&#xff0c;Windows平台下编译坑更多…

Linix与Windows上使用nc命令测试某一个服务器端口网络是否正常可访问详细安装及测试步骤

一、windows 1、下载nc安装包 https://nszyf.lanzoum.com/ihtqS0v0lwwh 2、下载后解压放置在自己电脑合适的位置&#xff0c;并且配置到环境变量中 3、配置成功环境变量&#xff0c;winr打开运行&#xff0c;输入cmd&#xff0c;回车&#xff0c;打开一个终端测试 测试成功…

实现VLAN间通信以太网链路聚合与交换机堆叠、集群华为ICT网络赛道

10.实现VLAN间通信 10.1.使用路由器实现VLAN间通信 使用路由器物理接口 路由器三层接口作为网关&#xff0c;转发本网段前往其它网段的流量。 路由器三层接口无法处理携带VLAN Tag的数据帧&#xff0c;因此交换机上联路由器的接口需配置为Access. 路由器的一个物理接口作为一…

【Docker】集群容器监控和统计 Portainer基本用法

Portainer是一款轻量级的应用&#xff0c;它提供了图形化界面&#xff0c;用川于方便地管理Docker环境&#xff0c;包括单机环境和集群环境。 主要功能&#xff1a;实现集群容器的监控和统计 下载安装 官网&#xff1a;https://www.portainer.io 文档&#xff1a;https://do…

Backtrader 量化回测实践(1)—— 架构理解和MACD/KDJ混合指标

Backtrader 量化回测实践&#xff08;1&#xff09;—— 架构理解和MACD/KDJ混合指标 按Backtrader的架构组织&#xff0c;整理了一个代码&#xff0c;包括了Backtrader所有的功能点&#xff0c;原来总是使用SMA最简单的指标&#xff0c;现在稍微增加了复杂性&#xff0c;用MA…

跟国外客户交流时怎么把英语说的更地道?

只要把中文逐字逐句翻译成对应的英文&#xff0c;就能讲好英语了吗&#xff1f; 并不&#xff01;那样的话我们只需要Google翻译不就可以了。 说英语时&#xff0c;要把思维也调整到英语模式&#xff0c;才能够说得流畅、地道。 01 对初次见面的老外&#xff0c;问他叫什么&a…

三防平板电脑在工程车上的应用|亿道三防onerugged

亿道三防onerugged系列产品中的M10T平板电脑&#xff0c;它以其卓越的性能和多功能的设计&#xff0c;为工程车智能天车管理系统带来了独特的应用体验。 首先&#xff0c;M10T平板电脑在工程智能天车管理系统中的应用展现了其卓越的实用性。工程车智能天车管理系统需要一个可靠…