代码随想录day37 动态规划(3)

416. 分割等和子集 - 力扣(LeetCode) 

解1:二维dp数组,时间O(m*n),空间O(m*n),m、n为dp数组的行和列数。

判断原数组总和能否整除2;

将target设为total // 2(若是total / 2,target为float,需要转为int才能以target为维度新建dp数组);

* 新建dp,行数 = nums长度,列数 = target+1,i行j列dp[i][j]表示从子数组nums[0:i+1](第0~第i个数)不重复地取数,能够获得的不超过j的最大总和。dp[len(nums)-1][target]若等于target,说明在整个nums中能够不重复地取出总和恰好为target的数,返回true。

* 考虑dp[i][j]的计算:若当前数nums[i] > j,说明i不可加入,于是dp[i][j] = dp[i-1][j]。否则,i可能加入,获得总和 = dp[i-1][j-nums[i]] + nums[i](将加入了i数的背包想象成两部分,一部分是i数本身,价值和重量都为i,另一部分不含i而且重量上限为j-nums[i],dp[i-1][j-nums[i]]就是第二部分能取到的最大价值);i也可以选择不加入,获得总和 = dp[i-1][j]。用i加入/不加入中的较大者更新dp[i][j]。

由此可见,需要通过dp[i][j]左侧及上侧的值计算它。遍历时从左到右,从上到下。

* base情况,考虑左、上边缘的值:1)dp[x][0]表示总和上限=0,因此dp[x][j]=0(dp本来都初始化为0,不需处理);2)dp[0][x]表示只考虑nums第0个数,则当x小于nums[0],初始为0,当x不小于nums[0],都初始化为nums[0]。

遍历每行、每列,直到右下角。

class Solution:def canPartition(self, nums: List[int]) -> bool:if len(nums) <= 1:return Falsetotal = sum(nums)if total % 2 != 0:return Falsetarget = total // 2#dp[i][j]:从nums的[0, i]中取数,能获得的不超过j的最大总和.dp: len(nums) * (target+1)dp = [[0 for _ in range(target+1)] for _ in range(len(nums))]#转移:dp[i][j] = max(dp[i-1][j], dp[i][j-nums[i]]+nums[i])#base:不超过0的最大总和:只能不取任何数,dp[x][0] = 0, #      只考虑第0个数时:dp[0][x] = nums[0] if x >= nums[0] else = 0for x in range(nums[0], target+1):dp[0][x] = nums[0]for j in range(1, target+1):#最大和=jfor i in range(1, len(nums)):#取0~i个数if nums[i] > j:dp[i][j] = dp[i-1][j]else:dp[i][j] = max(dp[i-1][j], dp[i-1][j-nums[i]]+nums[i])return dp[-1][-1] == target

解2:压缩为一维dp数组,时间O(m*n),空间O(n)

将物品/nums[i]维度压缩掉了,dp是长度=target+1的一维数组,按nums[0]的情况初始化dp。由于新的dp[j]需要参考“上一行左侧”或“上一行正上方”的值,应该从后往前遍历dp,防止上一行的值在使用之前被新的值覆盖。若当前数nums[i]超过当前上限j,不改变dp[j]的值(相等于沿用上一行正上方的值);否则,用当前值dp[j]与dp[j-nums[i]] + nums[i]的较大者更新当前值。

class Solution:def canPartition(self, nums: List[int]) -> bool:if len(nums) <= 1:return Falsetotal = sum(nums)if total % 2 != 0:return Falsetarget = total // 2dp = [0 for _ in range(target+1)]for i in range(1, target+1):if nums[0] <= i:dp[i] = nums[0]for i in range(1, len(nums)):for j in range(target, 0, -1):if nums[i] <= j:dp[j] = max(dp[j], dp[j-nums[i]] + nums[i])return dp[-1] == target

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

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

相关文章

遇到的异步问题

事例1&#xff1a; app.post("/predictfunc") async def predictfunc(item: Item):# 使用asyncio.to_thread()在单独的线程中运行predict_in_threadresult await asyncio.to_thread(predictfunc_main, item)return result 事例2&#xff1a; app.post("/remo…

PCL从理解到应用【02】PCL环境安装 | PCL测试| Linux系统

前言 本文介绍在Ubuntu18.04系统中&#xff0c;如何安装PCL。 源码安装方式&#xff1a;pcl版本1.91&#xff0c;vtk版本8.2.0&#xff0c;Ubuntu版本18.04。 安装好后&#xff0c;可以看到pcl的库&#xff0c;在/usr/lib/中&#xff1b; 通过编写C代码&#xff0c;直接调用…

华为路由器静态路由配置(eNSP模拟实验)

实验目标 如图下所示&#xff0c;让PC1ping通PC2 具体操作 配置PC设备ip 先配置PC1的ip、掩码、网关。PC2也做这样的配置 配置路由器ip 配置G0/0/0的ip信息 #进入系统 <Huawei>system-view #进入GigabitEthernet0/0/0接口 [Huawei]int G0/0/0 #设置接口的ip和掩码 […

【UE5.3】笔记7 控制Pawn移动

使用A、D键控制角色左右移动 打开我们的BP_Player蓝图类&#xff0c;选择事件图表&#xff0c;添加我们的控制事件 右键&#xff0c;搜索A keyboard&#xff0c;选择A,如下图&#xff0c;D也是 添加扭矩力 首先我们要把我们的player上的模拟物理选项打开&#xff0c;这样我们…

ChatGPT在Java后端开发中的应用与影响

随着人工智能技术的发展&#xff0c;尤其是OpenAI推出的聊天机器人模型ChatGPT&#xff0c;其强大的自然语言理解和生成能力正在改变着我们的生活和工作方式。在Java后端开发领域&#xff0c;ChatGPT同样有着广泛的应用前景&#xff0c;并且能够为Java后端开发者带来诸多好处。…

Caused by: java.io.IOException: Broken pipe

IO异常&#xff1a;管道破裂。 推荐文章&#xff1a;解决java.io.IOException: Broken pipe的报错

JavaFx基础知识

1.Stage 舞台 如此这样的一个框框&#xff0c;舞台只是这个框框&#xff0c;并不管里面的内容 public void start(Stage primaryStage) throws Exception {primaryStage.setScene(new Scene(new Group()));primaryStage.getIcons().add(new Image("/icon/img.png"))…

【不锈钢酸退作业区退火炉用高温辐射计快速安装】

项目名称 不锈钢酸退作业区退火炉用高温辐射计快速安装 改造实施项目简介项目提出前状况:不锈钢生产过程中,各种型号的不锈钢带钢在退火工艺中对带钢温度的准确性要求很高,带钢温度的检测直接影响带钢的产品质量,不锈钢带钢温度测量依靠的是高温辐射计,其测量的准确性、稳…

【Python机器学习】算法链与管道——通用的管道接口

Pipeline类补单可以用于预处理和分类&#xff0c;实际上还可以将任意数量的估计器连接在一起。例如&#xff0c;我们可以构建一个包含特征提取、特征选择、缩放和分类的管道&#xff0c;总共有4个步骤。同样的&#xff0c;最后一步可以用聚类或回归代替。 对于管道中估计器的唯…

@Validated 根据字段的值不同,动态分组校验

GroupSequenceProvider 配置 作用域只在单个对象的字段里 Data GroupSequenceProvider(value TestProvider.class) public class TestRO {NotNull(message "不能为空",groups ValidatedRemark.A.class)Pattern(regexp "2|3|",message "只能为2,…

vue2使用use注册自定义指令实现权限控制

版本环境 vue的版本是^2.6.12&#xff0c;将会使用到Vue.use()、Vue.directive() 适用环境 页面某些按钮&#xff0c;需要受到当前登录用户的“角色”“权限”的影响&#xff0c;通过store获取角色role和权限permission&#xff0c;通过自定义指令的方式&#xff0c;控制某一…

antd DatePicker日期选择框限制最多选择一年

实现效果 实现逻辑 import React, { useState } from react;const ParentComponent () > {const [dates, setDates] useState(null);const disabledDate (current) > {if (!dates) {return false;}const tooLate dates[0] && current.diff(dates[0], days) &…

Appium自动化测试框架1

电脑的浏览器 手机的浏览器 手机上的app 原生的应用 纯java 手机上的app apk 移动网页应用 纯HTML CSS 手机的浏览器上 电脑的浏览器上 混合应用 java html css python代码 Appium python库 Appium 手机 都是代表本机 0.0.0.0 127.0.0.1 localhost 如何启动app 启动参…

土壤养分化验仪:农业生态与可持续发展

随着现代农业技术的不断进步&#xff0c;土壤养分化验仪在农业生产中扮演着越来越重要的角色。这款高科技设备以其高精度、高效率的特点&#xff0c;为农业生态与可持续发展提供了强有力的支撑。 一、农田土壤监测与管理 农田是土壤养分化验仪最主要的应用场所。通过对农田土壤…

【AI】DeepStream(14):图像分割deepstream-segmentation-test示例演示

【AI】AI学习目录汇总 1、简介 deepstream-segmentation-test示例演示了图像的语义分割。两个配置文件,分别加载U-Net和Res-UNet两种分割模型 unet_output_graph.uffunetres18_v4_pruned0.65_800_data.uffU-Net是一个在生物医学图像分割领域广泛应用的卷积神经网络(CNN),…

集团型企业组织架构复杂,业务线多,如何进行高效费用管控?

企业管理中流行这样一句话&#xff1a;“企业转型&#xff0c;财务先行”。对集团型企业而言&#xff0c;当今的发展形势下&#xff0c;通过财务战略全面转型、最终撬动企业价值提升&#xff0c;是一件难而正确的事情。 集团企业具有经营规模大、产业链多、分支机构多、地域跨度…

地下电子标识器探测仪ED8000选型注意事项

ED8000探测仪是一台集成了多频率、多种ID标识器调制模式、高低灵敏度调节、可读写标识器等全功能、高性能电子标识器探测仪。它有着极高的灵敏度,同时具备良好的噪声抑制能力&#xff0c;不仅适合专业测绘人员&#xff0c;普通操作人员也可以轻松掌握。 ED8000可支持模拟电子标…

洛谷 P1042 [NOIP2003 普及组] 乒乓球

洛谷 P1042 [NOIP2003 普及组] 乒乓球 题目背景 国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革&#xff0c;以推动乒乓球运动在全球的普及。其中 11 11 11 分制改革引起了很大的争议&#xff0c;有一部分球员因为无法适应新规则只能选择退役。华华就是其中一位…

2024亚洲国际餐饮展览会(北京餐饮展|火锅展|预制菜展会)

2024北京餐饮展会&#xff0c;2024北京食材展会&#xff0c;2024北京火锅展会&#xff0c;2024北京火锅食材展会&#xff0c;2024北京预制菜展会&#xff0c;2024北京预制食材展会&#xff0c; 2024亚洲国际餐饮展览会&#xff08;北京餐饮展|火锅展|预制菜展会&#xff09; …

【C语言】刷题笔记 Day2

【笔记】 【1】局部变量不初始化&#xff0c;默认放的随机值。 1 int n0; 2 scanf("%d",&n); //13.141 【2】这里虽然输入的是一个浮点数&#xff0c;但是只取整数部分。 【3】3.156e7 表示的是3.156*10的7次方。 【4】多组输入&#xff0c;保存和不保存…