LeetCode算法题解(动态规划,背包问题)|LeetCode416. 分割等和子集

LeetCode416. 分割等和子集

题目链接:416. 分割等和子集
题目描述:

给你一个 只包含正整数 的 非空 数组 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
算法分析:
定义dp数组及下标含义:

dp[i][j]表示0~i中每个元素任取,其总和不大于j的最大值(能够在容量为j的背包里装下的最大值)。

递推公式:

dp[i][j] = max(dp[i-1][j], dp[i-1][j-nums[i]]+nums[i])。

初始化:

子集的总和不会超过原数组总和的一半,所以dp代表值的那个维度长度取其一半即可。

vector<vector<int>>dp(nums.size(), vector<int>(sum + 1, 0));for(int i = nums[0]; i <= sum; i++) {dp[0][i] = nums[0];}
遍历顺序:

元素遍历的for循环在外层,总和值的遍历在内层。

代码如下:

class Solution {
public:bool canPartition(vector<int>& nums) {int sum = 0;for(int i = 0; i < nums.size(); i++) {sum += nums[i];}if(sum % 2 != 0) return false;sum /= 2;vector<vector<int>>dp(nums.size(), vector<int>(sum + 1, 0));for(int i = nums[0]; i <= sum; i++) {dp[0][i] = nums[0];}for(int i = 1; i < nums.size(); i++) {for(int j = 0; j <= sum; j++) {if(j < nums[i]) dp[i][j] = dp[i - 1][j];else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - nums[i]] + nums[i]);if(dp[i][j] == sum) return sum;}}return false;}
};

状态压缩,将二维数组转化成一维数组(内从循环遍历总和值要倒着遍历):

class Solution{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;sum /= 2;int[] dp = new int[sum + 1];for(int i = nums[0]; i <= sum; i++)dp[i] = nums[0];for(int i = 1; i < nums.length; i++) {for(int j = sum; j >= nums[i]; j--) {dp[j] = Math.max(dp[j], dp[j - nums[i]] + nums[i]);}if(dp[sum] == sum) return true;}return false;}
}

总结

对于类似背包的问题,可以将其视为背包问题看待,找准背包容量和物品的对应对象。

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

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

相关文章

Linux中的进程程序替换

Linux中的进程程序替换 1. 替换原理2. 替换函数3. 函数解释4. 命名理解程序替换的意义 1. 替换原理 替换原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的…

[Docker]九.Docker compose讲解

docker-compose 是 docker 官方的一个开源项目&#xff0c;可以实现对 docker 容器集群的快速编排, docker-compose 通过一个 配置文件 来管理多个 Docker 容器,在配置文件中&#xff0c;所有的容器通过 services 来定义&#xff0c;然后使用 docker-compose脚本 来 启动&am…

Nuxt.js Next.js Nest.js

Nuxt.js和Next.js都是服务端渲染框架(SSR)&#xff0c;属于前端框架,Nest.js则是node框架,属于后端框架。 其中Nuxt.js是vue的ssr框架&#xff0c;Next.js是react的ssr框架。 都是比vue和react更上层的前端框架。 文章目录 1.SSR2.Nuxt2.1 Nuxt的下载2.2 Nuxt的集成2.3 Nuxt…

HuggingFace-利用BERT预训练模型实现中文情感分类(下游任务)

准备数据集 使用编码工具 首先需要加载编码工具&#xff0c;编码工具可以将抽象的文字转成数字&#xff0c;便于神经网络后续的处理&#xff0c;其代码如下&#xff1a; # 定义数据集 from transformers import BertTokenizer, BertModel, AdamW # 加载tokenizer token Ber…

cobol基本动词

cobol基本动词 基本动词用于过程部中的数据处理。每个语句总是以cobol动词开头。 input&#xff08;输入&#xff09;/output&#xff08;输出&#xff09; 输入输出动词用于从用户获取数据。并显示cobol程序的输出。 accept 用于从操作系统或者用户获取数据&#xff0c;例如日…

langchain 部署组件-LangServe

原文&#xff1a;&#x1f99c;️&#x1f3d3; LangServe | &#x1f99c;️&#x1f517; Langchain LangServe &#x1f6a9; We will be releasing a hosted version of LangServe for one-click deployments of LangChain applications. Sign up here to get on the wa…

OpenLayers入门,OpenLayers6的WebGLPointsLayer图层样式和运算符详解,四种symbolType类型案例

专栏目录: OpenLayers入门教程汇总目录 前言 本章讲解使用OpenLayers6的WebGL图层显示大量点情况下,列举出所有WebGLPointsLayer图层所支持的所有样式运算符大全。 补充说明 本篇主要介绍OpenLayers6.x版本的webgl图层,OpenLayers7.x和OpenLayers8.x主要更新内容就是webgl…

GB28181学习(十七)——基于jrtplib实现tcp被动和主动发流

前言 GB/T28181-2022实时流的传输方式介绍&#xff1a;https://blog.csdn.net/www_dong/article/details/134255185 基于jrtplib实现tcp被动和主动收流介绍&#xff1a;https://blog.csdn.net/www_dong/article/details/134451387 本文主要介绍下级平台或设备发流功能&#…

生活如果真能像队列一样的话

生活如果真能像队列一样&#xff0c;那该多好啊。 —————————————————————————————————————————— 背包&#xff0c;队列 可以先看他们的API&#xff1a;都含有一个无参构造函数&#xff0c;添加单个元素的方法&#xff0c;测试集合…

php项目从宝塔面板切换转到phpstudy小皮面板

宝塔面板转phpstudy面板 版本 宝塔面板8.0.1 phpstudy面板8.1.1.3 步骤 1、宝塔面板,找到项目文件夹,打包、下载到本地、解压 2、本地windows系统安装phpstudy面板,选择尽可能一样的配置 比如宝塔php7.4.33,可能phpstudy面板只有php7.4.3,也行 大环境一定要一致,比如…

力扣算法练习BM46—最小的K个数

题目 给定一个长度为 n 的可能有重复值的数组&#xff0c;找出其中不去重的最小的 k 个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字&#xff0c;则最小的4个数字是1,2,3,4(任意顺序皆可)。 数据范围&#xff1a;0≤k,n≤10000&#xff0c;数组中每个数的大小0≤val≤1000 要…

linux signal 机制

ref&#xff1a; Linux操作系统学习笔记&#xff08;十六&#xff09;进程间通信之信号 | Ty-Chens Home https://www.cnblogs.com/renxinyuan/p/3867593.html 当执行kill -9 PID时系统发生了什么 -

Codeforces Round 910 (Div. 2) D. Absolute Beauty

D. Absolute Beauty 有两个长度为 n n n 的整数数组 a 1 , a 2 , … , a n a_1,a_2,\ldots,a_n a1​,a2​,…,an​ 和 b 1 , b 2 , … , b n b_1,b_2,\ldots,b_n b1​,b2​,…,bn​ 。他将数组 b b b 的美丽值定义为 ∑ i 1 n ∣ a i − b i ∣ . \sum_{i1}^{n} |a_i - b…

基于材料生成算法优化概率神经网络PNN的分类预测 - 附代码

基于材料生成算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于材料生成算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于材料生成优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

JDK命令使用总结

目录 javacjava javac 将源码(*.java)编译成字节码(*.class) javac HelloWorld.javajava 运行字节码(*.class) 不能加后缀名 java HelloWorld直接运行单文件源码(*.java) Java11以上才支持 java HelloWorld.java

ROSNS3(一)

https://github.com/malintha/rosns3 第一步&#xff1a;clone和构建rosns3客户端 第二步&#xff1a;运行 最详细的ubuntu 安装 docker教程 - 知乎 1. unable to find source space /home/muta/src 解决方法&#xff1a; 将副将将碰到的bug&#xff0c;解决方法_#include &…

【C++ Primer Plus学习记录】递增运算符(++)和递减运算符(--)

递增运算符&#xff08;&#xff09;和递减运算符&#xff08;--&#xff09;&#xff1a;前缀版本位于操作数前面&#xff0c;如x&#xff1b;后缀版本位于操作数后面&#xff0c;如x。两个版本对操作数的影响是一样的&#xff0c;但是影响的时间不同。这就像吃饭前买单和吃饭…

Python从零开始快速搭建一个语音对话机器人

文章目录 01-初心缘由02-准备工作03-语音机器人的搭建思路04-语音生成音频文件05-音频文件转文字STT06-与图灵机器人对话07-文字转语音08-语音对话机器人的完整代码09-结束语10-有问必答关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学…

SSH连接远程服务器报错:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED 解决方法

一.错误描述 报错信息里提示了路径信息/root/.ssh/known_hosts:20 二.解决方案 方法一 输入以下指令&#xff1a; ssh-keygen -R XXX&#xff08;需要连接远程服务器的ip&#xff09; 按照我的例子ip:10.165.7.136&#xff0c;会返回以下信息: 重新尝试连接&#xff1a; 输…