代码随想录 day38 动态规划part04

416. 分割等和子集

给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。注意: 每个数组中的元素不会超过 100 数组的大小不会超过 200示例 1:输入: [1, 5, 11, 5]
输出: true
解释: 数组可以分割成 [1, 5, 5][11].
示例 2:输入: [1, 2, 3, 5]
输出: false
解释: 数组不能分割成两个元素和相等的子集.
提示:1 <= nums.length <= 200
1 <= nums[i] <= 100

思路

数组nums是否可以分为两个和相等的数组。
# sums = sum(nums())
if sums % 2: return False  # 奇数
dp[j]: 在重量为j背包中可装入的最大价值是多少。
dp[j] = max(dp[j], dp[j - nums[i]] + nums[i])dp定义:
dp = [0] * (sums+1)dp初始化:
不需要初始化,直接为0就行。使用滑动数组
for i in range(len(nums)):for j in range(sums, nums[i] -1):dp[j] = max(dp[j], dp[j - nums[i] + nums[i])
half1 = sums // 2
if dp[half1] == half1: return True
else: return False## 优化一下,我们在结果中只用到了half1,可以把dp长度减半。
sums = sum(nums())
half1 = sums // 2
dp = [0] * (half1+1)for i in range(len(nums)):for j in range(half, nums[i] -1):dp[j] = max(dp[j], dp[j - nums[i] + nums[i])
half1 = sums // 2
if dp[-1] == half1: return True
else: return False

code python

class Solution:def canPartition(self, nums: List[int]) -> bool:_sum = 0for num in nums:_sum += numif _sum % 2 != 0:return Falsetarget = _sum // 2dp = [0] * (target + 1)for num in nums:for j in range(target, num-1, -1):dp[j] = max(dp[j], dp[j-num] + num)return dp[-1] == target

1049.最后一块石头的重量II

有一堆石头,每块石头的重量都是正整数。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:如果 x == y,那么两块石头都会被完全粉碎;如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。最后,最多只会剩下一块石头。返回此石头最小的可能重量。如果没有石头剩下,就返回 0。示例:输入:[2,7,4,1,8,1]
输出:1
解释:组合 24,得到 2,所以数组转化为 [2,7,1,8,1],
组合 78,得到 1,所以数组转化为 [2,1,1,1],
组合 21,得到 1,所以数组转化为 [1,1,1],
组合 11,得到 0,所以数组转化为 [1],这就是最优值。
提示:1 <= stones.length <= 30
1 <= stones[i] <= 1000

思路

sums = sum(nums)
half1 = sums // 2
# 尽可能接近一半
dp[j]: 重量为j的背包可装的最大价值dp[i]
dp[j] = max(dp[j], dp[j-nums[i]] + nums[i])dp = [0] * (half1 + 1)for num in nums:for j in range(half, num - 1, -1)dp[j] = max(dp[j], dp[j-num] + num)return sums - dp[half1]* 2

code pyton

class Solution:def lastStoneWeightII(self, stones):total_sum = sum(stones)target = total_sum // 2dp = [0] * (target + 1)for stone in stones:for j in range(target, stone - 1, -1):dp[j] = max(dp[j], dp[j - stone] + stone)return total_sum - 2* dp[-1]

494.目标和

给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S。现在你有两个符号 +-。对于数组中的任意一个整数,你都可以从 +- 中选择一个符号添加在前面。
返回可以使最终数组和为目标数 S 的所有添加符号的方法数。
示例:
输入:nums: [1, 1, 1, 1, 1], S: 3
输出:5
解释:
-1+1+1+1+1 = 3
+1-1+1+1+1 = 3
+1+1-1+1+1 = 3
+1+1+1-1+1 = 3
+1+1+1+1-1 = 3一共有5种方法让最终目标和为3。
提示:
数组非空,且长度不会超过 20 。
初始的数组的和不会超过 1000 。
保证返回的最终结果能被 32 位整数存下。

思路

left和 + right和 = sums
left和 - right和 = target
left和 = (sums + target) / 2
其中,target,sums确定
dp[j] = 和为j的方法数
sums = sum(nums)
left = (sums + target) / 2if left % 2: return 0
if(abs(s) > sums): return 0
dp = [0] * (sums + 1)
dp[0] = 1
for num in nums:for j in range(sums, num-1, -1):dp[j] += dp[j-num]
return dp[left]

code

class Solution:def findTargetSumWays(self, nums: List[int], target: int) -> int:total_sum = sum(nums)  # 计算nums的总和if abs(target) > total_sum:return 0  # 此时没有方案if (target + total_sum) % 2 == 1:return 0  # 此时没有方案target_sum = (target + total_sum) // 2  # 目标和dp = [0] * (target_sum + 1)  # 创建动态规划数组,初始化为0dp[0] = 1  # 当目标和为0时,只有一种方案,即什么都不选for num in nums:for j in range(target_sum, num - 1, -1):dp[j] += dp[j - num]  # 状态转移方程,累加不同选择方式的数量return dp[target_sum]  # 返回达到目标和的方案数

回溯方法

class Solution:def backtracking(self, candidates, target, total, startIndex, path, result):if total == target:result.append(path[:])  # 将当前路径的副本添加到结果中# 如果 sum + candidates[i] > target,则停止遍历for i in range(startIndex, len(candidates)):if total + candidates[i] > target:breaktotal += candidates[i]path.append(candidates[i])self.backtracking(candidates, target, total, i + 1, path, result)total -= candidates[i]path.pop()def findTargetSumWays(self, nums: List[int], target: int) -> int:total = sum(nums)if target > total:return 0  # 此时没有方案if (target + total) % 2 != 0:return 0  # 此时没有方案,两个整数相加时要注意数值溢出的问题bagSize = (target + total) // 2  # 转化为组合总和问题,bagSize就是目标和# 以下是回溯法代码result = []nums.sort()  # 需要对nums进行排序self.backtracking(nums, bagSize, 0, 0, [], result)return len(result)

474.一和零

给你一个二进制字符串数组 strs 和两个整数 m 和 n 。请你找出并返回 strs 的最大子集的大小,该子集中 最多 有 m 个 0 和 n 个 1 。如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。示例 1:
输入:strs = ["10", "0001", "111001", "1", "0"], m = 5, n = 3
输出:4解释:最多有 5031 的最大子集是 {"10","0001","1","0"} ,因此答案是 4 。 其他满足题意但较小的子集包括 {"0001","1"}{"10","1","0"}{"111001"} 不满足题意,因为它含 41 ,大于 n 的值 3 。示例 2:
输入:strs = ["10", "0", "1"], m = 1, n = 1
输出:2
解释:最大的子集是 {"0", "1"} ,所以答案是 2 。
提示:1 <= strs.length <= 600
1 <= strs[i].length <= 100
strs[i] 仅由 '0''1' 组成
1 <= m, n <= 100

思路

dp[i][j]  0的最大个数<=i, 1的最大个数<=j的字符串最大个数为dp[i][j]dp[i][j]= max(dp[i][j], dp[i-cur0][j-cur1] + 1)
dp[j] = max(dp[j], dp[j-weigh[i]] + value[i])dp[i][j] = [[0] * (n + 1)] * (m + 1)   # m = 0, n = 1
dp[0][0] = 1strs = ["10", "0001", "111001", "1", "0"]
v = "10"
cur0, cur1 = 1,1
dp[5][3]
for i in range(5, -1):
forj in range(3, -1,-1):if i >= 1 and j >= 1:dp[i][j] = 1v = "0001"
cur0, cur1 = 3, 1
for i in range(5, -1):
forj in range(3, -1,-1):if i >= 3 and j >= 1:dp[i][j] = max(dp[i][j], dp[i-3][j-1] + 1)v = "111001"
cur0, cur1 = 2, 4
for i in range(5, -1):
forj in range(3, -1,-1):if i >= 2 and j >= 4:dp[i][j] = max(dp[i][j], dp[i-2][j-4] + 1)v = "1"
cur0, cur1 = 0, 1
for i in range(5, -1):
forj in range(3, -1,-1):if i >= 0 and j >= 1:dp[i][j] = max(dp[i][j], dp[i-0][j-1] + 1)v = "0"
cur0, cur1 = 1, 0
for i in range(5, -1):
forj in range(3, -1,-1):if i >= 1 and j >= 0:dp[i][j] = max(dp[i][j], dp[i-1][j-0] + 1)def counts1(str1):cur0, cur1 = 0, 0for v in str1:if v == '1': cur1 += 1else: cur0 += 1return cur0, cur1for v in strs:cur0, cur1 = counts1(v)for i in range(n, -1, -1):for j in range(m, -1, -1):if i >= cur0 and j >= cur1:dp[i][j] = max(dp[i][j], dp[i-cur0][j-cur1] + 1)

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

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

相关文章

Web学习day04

mybatis 目录 mybatis 文章目录 一、查询 1.1结果映射 1.2多条件查询 1.3模糊查询 二、XML 书写规范 三、动态SQL 四、配置文件 4.1settings标签 4.2mappers标签 4.3environments标签 五、案例 5.1数据表 5.2实现类 5.3mapper实现 5.4工具类实现 5.5XML动态…

解决spring boot中使用拦截器导致swagger文档无法访问

目录 问题场景 解决方案 问题场景 我们的spring boot项目通常会使用接口文档管理依赖如knife4j(swagger3) Spring Boot3整合knife4j(swagger3)_springboot3 knife4j-CSDN博客 通常也会使用拦截器来做登录鉴权、接口限流等操作&#xff0c;但是使用拦截器会导致swagger接口…

FFmpeg学习(五)-- libswresample使用说明及函数介绍

libswresample Audio合成和重采样 libswresample库用来进行audio数据的合成和重采样操作。调用流程&#xff1a; 调用 swr_alloc 创建SwrContext结构体。设置SwrContext参数&#xff0c;有两种方法&#xff1a; 调用av_opt_set_xx函数逐项设置参数&#xff1b;swr_alloc_set_…

Python应用 | 基于flask-restful+AntDesignVue实现的一套图书管理系统

本文将分享个人自主开发的一套图书管理系统&#xff0c;后端基于Python语言&#xff0c;采用flask-restful开发后端接口&#xff0c;前端采用VueAntDesignVue实现。对其他类似系统的实现&#xff0c;比如学生管理系统等也有一定的参考作用。有问题欢迎留言讨论~ 关注公众号&am…

04.为什么line-height是无单位的 兄弟元素淡出效果 蚀刻文字效果

为什么 CSS 中的 line-height 应该是无单位的? 我经常听说 line-height 应该始终是无单位的。在我早期的编码年代,我没有过多地质疑这一点,但最近我开始想知道为什么会这样。在我看来,1.5 和 1.5em 应该产生相同的结果,对吧?事实证明,它们并非如此。 两者之间有一个细微的区…

记一下blender曲线阵列

先说一下如何正常使用这个 这一次我是用来贴瓷砖 随便创建一个mesh 然后添加一个阵列修改器&#xff0c;然后再给他添加一个curve修改器&#xff0c;使用constant offset去偏移他 这里有个小细节 我第一次创建的curve 我选取之后&#xff0c;死活无法沿着曲线阵列&#xff…

Dockerfile指令

Dockerfile指令 1、Dockerfile指令? 1)、COPY&#xff1a;类似ADD&#xff0c;将我们的文件拷贝到镜像中&#xff0c;也就是复制本地(宿主机)上的文件到镜像。 COPY [--chown<user>:<group>] ["<源路径1>",... "<目标路径>"] …

.快速幂.

按位与&#xff08;Bitwise AND&#xff09;是一种二进制运算&#xff0c;它逐位对两个数的二进制表示进行运算。对于每一位&#xff0c;只有两个相应的位都为1时&#xff0c;结果位才为1&#xff1b;否则&#xff0c;结果位为0。如&#xff1a;十进制9 & 5转化为二进制&am…

ActiveMQ-CVE-2023-46604

Apache ActiveMQ OpenWire 协议反序列化命令执行漏洞 OpenWire协议在ActiveMQ中被用于多语言客户端与服务端通信。在Apache ActvieMQ5.18.2版本以及以前&#xff0c;OpenWire协议通信过程中存在一处反序列化漏洞&#xff0c;该漏洞可以允许具有网络访问权限的远程攻击者通过操作…

opencv 中如何通过欧式距离估算实际距离(厘米)

1&#xff1a;这个方法个人测试觉得是正确的&#xff0c;误差较小&#xff0c;目前满足我当前的需求&#xff0c;如果方法不对&#xff0c;请大家评论&#xff0c;完善。 2&#xff1a;确保拍摄的参照物是垂直的&#xff0c;如果不垂直&#xff0c;就会有误差&#xff0c;不垂…

Django是干什么的?好用么?

Django是一个开源的Python Web框架&#xff0c;用于快速开发高质量的Web应用程序。它提供了许多功能和工具&#xff0c;以简化常见的Web开发任务&#xff0c;如路由、请求处理、数据库管理等。 Django的优点包括&#xff1a; 简单易用&#xff1a;Django提供了清晰的文档和丰…

HASHTABLE, HASHMAP,TreeMap区别

Hashtable、HashMap 和 TreeMap 都是Java集合框架中的实现&#xff0c;它们提供了键值对映射的数据结构&#xff0c;但它们在实现细节、性能特性和使用场景上有所不同&#xff1a; 1. Hashtable: - Hashtable 是遗留下来的类&#xff0c;继承自 Dictionary 类。 - 它实现…

低代码商城构建专家:Mall-Cook

Mall-Cook&#xff1a;用Mall-Cook&#xff0c;让电商创新触手可及- 精选真开源&#xff0c;释放新价值。 概览 Mall-Cook是一个面向未来的商城低代码开发平台&#xff0c;它通过提供直观的可视化界面&#xff0c;让开发者和商家能够快速构建和部署跨平台的电商解决方案。这个…

微信小程序如何实现登陆和注册功能?

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

SQL基本查询

简单查询 单表查询 查询表的全部信息&#xff1a; --student是要查询的表 select * from student 使用别名查询表中的某个字段&#xff0c;或使用别名创建一个新的字段&#xff1a; select name as studentname from student --把查询出来的名字的列名改为学生姓名 …

服务器提交记录有Merge branch消除

背景&#xff1a;在共同开发分支release上&#xff0c;你提交了commit&#xff0c;push到服务器上时&#xff0c;发现有人先比你push了&#xff0c;所以你得先pull&#xff0c; 后再push&#xff0c;然而pull后自动产生了一个Merge branch的一个commit&#xff0c;这个commit本…

递归解决换零钱问题--回顾总结之递归的表达能力

前面为了保持叙述的流畅, 没有做太多的引申, 把总结推迟到了后面. 补上一些总结, 以防止出现 “下面呢? 下面没有了” 的尴尬. 方向性问题 虽然题目在一开始就暗示了这一点, 但首先, 我们还是要问, 它能用递归解决吗? 有点怀疑精神是好的, 既要低头走路, 更要抬头看路, 以防…

JDK14新特征最全详解

JDK 14一共发行了16个JEP(JDK Enhancement Proposals&#xff0c;JDK 增强提案)&#xff0c;筛选出JDK 14新特性。 - 343: 打包工具 (Incubator) - 345: G1的NUMA内存分配优化 - 349: JFR事件流 - 352: 非原子性的字节缓冲区映射 - 358: 友好的空指针异常 - 359: Records…

【JavaScript】解决 JavaScript 语言报错:Uncaught TypeError: XYZ is not iterable

文章目录 一、背景介绍常见场景 二、报错信息解析三、常见原因分析1. 对非数组类型使用 for...of 循环2. 对非可迭代对象使用扩展运算符3. 在 Promise.all 中传递非可迭代对象4. 使用解构赋值时&#xff0c;右侧值非可迭代 四、解决方案与预防措施1. 确保使用可迭代对象2. 使用…

一些Java集合面试题

1.总体讲一下Java集合 Java集合主要是由两大接口派生而来。一个是Collection接口&#xff0c;主要用于存放单一元素&#xff0c;主要分成Set&#xff0c;List和Queue三大类&#xff1b;另一个是Map接口&#xff0c;主要用于存放键值对元素&#xff0c;主要实现类就是HashMap、…