面试算法101:分割等和子集

题目

给定一个非空的正整数数组,请判断能否将这些数字分成和相等的两部分。例如,如果输入数组为[3,4,1],将这些数字分成[3,1]和[4]两部分,它们的和相等,因此输出true;如果输入数组为[1,2,3,5],则不能将这些数字分成和相等的两部分,因此输出false。

分析

如果能够将数组中的数字分成和相等的两部分,那么数组中所有数字的和(记为sum)应该是一个偶数。也可以换一个角度来描述这个问题:能否从数组中选出若干数字,使它们的和等于sum/2(将sum/2记为t)。如果将数组中的每个数字看成物品的重量,也可以这样描述这个问题:能否选择若干物品,使它们刚好放满一个容量为t的背包?由于每个物品(数字)最多只能选择一次,因此这是一个0-1背包问题。(本题一共两个背包)
用函数f(i,j)表示能否从前i个物品(物品标号分别为0,1,…,i-1)中选择若干物品放满容量为j的背包。如果总共有n个物品,背包的容量为t,那么f(n,t)就是问题的解。
当判断能否从前i个物品中选择若干物品放满容量为j的背包时,对标号为i-1的物品有两个选择。一个选择是将标号为i-1的物品放入背包中,如果能从前i-1个物品(物品标号分别为0,1,…,i-2)中选择若干物品放满容量为j-nums[i-1]的背包(即f(i-1,j-nums[i-1])为true),那么f(i,j)就为true。另一个选择是不将标号为i-1的物品放入背包中,如果从前i-1个物品中选择若干物品放满容量为j的背包(即f(i-1,j)为true),那么f(i,j)也为true。

解:递归

public class Test {public static void main(String[] args) {int[] nums = {1, 2, 3, 5};boolean result = canPartition(nums);System.out.println(result);}// 本题一共两个背包public static boolean canPartition(int[] nums) {int sum = 0;for (int num : nums) {sum += num;}if (sum % 2 == 1) {return false;}// 其中一些数字之和为sum/2,则能将所有数字分成和相等的两部分// 则问题转化:能否从nums中选出一些数字,使这些数字之和为sum/2return subsetSum(nums, sum / 2);}private static boolean subsetSum(int[] nums, int target) {Boolean[][] dp = new Boolean[nums.length + 1][target + 1];return helper(nums, dp, nums.length, target);}private static boolean helper(int[] nums, Boolean[][] dp, int i, int j) {if (dp[i][j] == null) {if (j == 0) {dp[i][j] = true;}else if (i == 0) {dp[i][j] = false;}else {dp[i][j] = helper(nums, dp, i - 1, j);// 不选择元素nums[i-1];if (!dp[i][j] && j >= nums[i - 1]) {dp[i][j] = helper(nums, dp, i - 1, j - nums[i - 1]);// 选择元素nums[i-1];}}}return dp[i][j];}
}

解:迭代

public class Test {public static void main(String[] args) {int[] nums = {1, 2, 3, 5};boolean result = canPartition(nums);System.out.println(result);}public static boolean canPartition(int[] nums) {int sum = 0;for (int num : nums) {sum += num;}if (sum % 2 == 1) {return false;}// 其中一些数字之和为sum/2,则能将所有数字分成和相等的两部分// 则问题转化:能否从nums中选出一些数字,使这些数字之和为sum/2return subsetSum(nums, sum / 2);}private static boolean subsetSum(int[] nums, int target) {boolean[][] dp = new boolean[nums.length + 1][target + 1];for (int i = 0; i < nums.length; i++) {dp[i][0] = true;// 和为0,那么一个数字都不选,一定为true}for (int i = 1; i <= nums.length; i++) {for (int j = 1; j <= target; j++) {dp[i][j] = dp[i - 1][j];// // 不选择元素nums[i-1];if (!dp[i][j] && j >= nums[i - 1]) {dp[i][j] = dp[i - 1][j - nums[i - 1]];// 选择元素nums[i-1];}}}return dp[nums.length][target];}}

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

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

相关文章

Docker 中使用超级用户

在docker中安装keytool产生的问题&#xff1a; sudo apt-get install openjdk-8-jre-headless bash: sudo: command not found elasticsearchd989639e3cb4:~/config/certs$ apt-get install openjdk-8-jre-headless E: Could not open lock file /var/lib/dpkg/lock-frontend …

【代码复现系列】paper:CycleGAN and pix2pix in PyTorch

或许有冗余步骤、之后再优化。 1.桌面右键-git bash-输入命令如下【git clone https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix】 2.打开anaconda的prompt&#xff0c;cd到pytorch-CycleGAN-and-pix2pix路径 3.在prompt里输入【conda env create -f environment.y…

【数值分析】逼近,正交多项式

逼近 由离散点&#xff08;函数表&#xff09;给出函数关系通常有两种方法&#xff1a; 使用多项式插值 使用多项式插值会带来两个问题&#xff1a;1. 龙格现象2. 数值本身带有误差&#xff0c;使用插值条件来确定函数关系不合理三次样条插值 三次样条插值克服了龙格现象&…

多线程在编程中的重要性有什么?并以LabVIEW为例进行说明

多线程在编程中的重要性体现在以下几个方面&#xff1a; 并行处理&#xff1a; 多线程允许程序同时执行多个任务&#xff0c;这在现代多核心处理器上尤其重要。通过并行处理&#xff0c;可以显著提高程序的执行效率和响应速度。 资源利用最大化&#xff1a; 通过多线程&#x…

工厂设计模式的思考

工厂模式对于开发者来说并不陌生&#xff0c;他利用多肽性很好的进行业务之间的解耦&#xff0c;不同的场景创建不同的实现&#xff0c;从而使得更多的关注业务实现,这种简单的实现这里不在举例。但是如果情形比较多的时候就会遇到问题&#xff0c;我们的工厂类就会产生大量的i…

Nacos与Eureka的区别详解

Nacos与Eureka的区别详解 在微服务架构中,服务注册与发现是核心组件之一,它们允许服务实例在启动时自动注册,并且能被其他服务发现,从而实现服务之间的互相通信。Nacos和Eureka都是现代微服务体系中广泛使用的服务注册与发现工具。本文将深入分析二者的区别,并为您提供一…

基于YOLOv7开发构建道路交通场景下CCTSDB2021交通标识检测识别系统

交通标志检测是交通标志识别系统中的一项重要任务。与其他国家的交通标志相比&#xff0c;中国的交通标志有其独特的特点。卷积神经网络&#xff08;CNN&#xff09;在计算机视觉任务中取得了突破性进展&#xff0c;在交通标志分类方面取得了巨大的成功。CCTSDB 数据集是由长沙…

OpenFeign超时控制

OpenFeign超时控制 前面简单介绍了Feign和OpenFeign的关系&#xff0c;言归正传&#xff0c;接下来我们看看OpenFeign如何设置调用超时&#xff0c;openFeign其实是有默认的超时时间的&#xff0c;默认分别是连接超时时间10秒、读超时时间60秒&#xff0c;源码在feign.Request…

Elasticsearch中object类型与nested类型以及数组之间的区别

一、区别&#xff1a; 0、一般情况下用object 类型来查es中为json对象的字段数据&#xff0c;用nested来查es中为JsonArray数组类型的字段数据。 1、默认情况下ES会把JSON对象直接映射为object类型&#xff0c;只有手动设置才会映射为nested类型 2、object类型可以直接使用普…

十九:爬虫最终篇-平安银行商城实战

平安银行商场实战 需求 获取该商城商品信息 目标网址 https://m.yqb.com/bank/product-item-50301196.html?mcId1583912328849970&loginModepab&historyy&sceneModem&traceid30187_4dXJVel1iop详细步骤 1、寻找数据接口 2、对比payload寻找可疑参数 3、多…

Day28 回溯算法part04 93. 复原IP地址 78. 子集 90. 子集 II

回溯算法part04 93. 复原IP地址 78. 子集 90. 子集 II 93. 复原 IP 地址 class Solution { private:vector<string> result;bool isValid(string& s,int start,int end){if (start > end) return false;if (s[start] 0 && start ! end) { // 0开头的数…

图像融合论文阅读:CrossFuse: 一种基于交叉注意机制的红外与可见光图像融合方法

article{li2024crossfuse, title{CrossFuse: A novel cross attention mechanism based infrared and visible image fusion approach}, author{Li, Hui and Wu, Xiao-Jun}, journal{Information Fusion}, volume{103}, pages{102147}, year{2024}, publisher{Elsevier} } 论文…

Yum(Yellowdog Updater Modified)命令大全详解

Yum&#xff08;Yellowdog Updater Modified&#xff09;是一个在基于RPM的Linux发行版上常用的包管理工具&#xff0c;主要用于自动安装、自动删除、自动升级软件包。下面列出了一些常见的Yum命令以及它们的解释&#xff1a; 安装软件包&#xff1a; yum install packageName…

当试图回复传入消息时,消息应用程序会闪烁

问题描述&#xff1a; Actual Results: Unable to reply for incoming message as Messaging app flickers and closes. Expected Results: User should be able to send reply for incoming messages. Reproduction Steps: Stay in home screen. Receive an incoming mes…

如何在 Ubuntu 20.04 上安装和使用 Docker

前些天发现了一个人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;最重要的屌图甚多&#xff0c;忍不住分享一下给大家。点击跳转到网站。 如何在 Ubuntu 20.04 上安装和使用 Docker 介绍 Docker是一个可以简化容器中应用程序进程管理过程的应用程序。…

拦截器HandlerInterceptor | springmvc系列

拦截器&#xff0c;通俗来来将&#xff0c;就是我们将访问某个路径的请求给拦截下来&#xff0c;然后可以对这个请求做一些操作 基本使用 创建拦截器类 让类实现HandlerInterceptor接口&#xff0c;重写接口中的三个方法。 Component //定义拦截器类&#xff0c;实现Handle…

如何编写kubernetes中使用的yaml文件?(基础概括版)

在操作kubernetes的过程中&#xff0c;我们经常接触到yaml文件&#xff0c;甚至有不少yaml文件超级长&#xff0c;就像在搭建集群的过程中&#xff0c;我们要用到的yaml文件&#xff0c;都是直接拷贝别人的&#xff0c;那这个yaml怎么解读&#xff1f;如果自己要写的话&#xf…

Python实现PowerPoint(PPT/PPTX)到PDF的批量转换

演示文稿是一种常见传达信息、展示观点和分享内容的形式&#xff0c;特别是PowerPoint演示文稿&#xff0c;广泛应用于各行各业&#xff0c;几乎是演讲等场合的必备工具。然而&#xff0c;演示文稿也有其限制&#xff0c;对设备的要求较高&#xff0c;且使用不同的软件或设备演…

uView route 路由跳转

route(Object) 此为一个路由跳转方法&#xff0c;内部是对uni多个路由跳转api的封装&#xff0c;更方便使用 Object参数说明&#xff1a; 参数名类型默认值是否必填说明typeStringnavigateTofalsenavigateTo或to对应uni.navigateTo&#xff0c;redirect或redirectTo对应uni.…

Ubuntu下AI4Green开源ELN服务的简单部署

主部署程序&#xff1a;AI4Green 配置参考这篇文档&#xff1a;AI4Green开源ELN&#xff08;电子实验记录本&#xff09;-CSDN博客 流量转发和负载均衡&#xff1a;使用Nginx 配置参考这篇文档&#xff1a;Nginx负载均衡-CSDN博客 SSL配置部分参考这篇文档&#xff1a; 设置…