【Leetcode刷题Python】416. 分割等和子集
1 题目
给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
示例 1:
输入:nums = [1,5,11,5]
输出:true
解释:数组可以分割成 [1, 5, 5] 和 [11] 。
示例 2:
输入:nums = [1,2,3,5]
输出:false
解释:数组不能分割成两个元素和相等的子集。
2 解析
动态规划方法:
和 279. 完全平方数类似的思想,用枚举的累计和方法
整个集合总和的一半为maxn,
我们可以枚举1到maxn的数,即maxn大的数组,表示为dp
状态:dp[i]表示加上i后子集的累计值
我们要计算子集和是否等于maxn,这需要去计算 i − n u m s [ i ] i-nums[i] i−nums[i]位置的累计和 。此时我们发现该子问题和原问题类似,只是规模变小了。这符合了动态规划的要求,于是我们可以写出状态转移方程。
d p [ i ] = max j = 0 m a x n ( f [ i ] , f [ i − n u m s [ i ] ] + n u m s [ i ] ) dp[i]=\max_{j=0}^{maxn}(f[i],f[i-nums[i]]+nums[i]) dp[i]=j=0maxmaxn(f[i],f[i−nums[i]]+nums[i])
初始化dp[i]=0
最后判断dp[maxn]是否等于maxn,如果等于,说明,子集和等于maxn,返回True
3 python实现
class Solution:
def canPartition(self, nums: List[int]) -> bool:
all = sum(nums)
if(all % 2 != 0): return False
maxn = int(all / 2)
dp = [0]*(maxn + 1)
for i in range(len(nums)):
for j in range(maxn,nums[i]-1,-1):
# 更新每个位置的值
dp[j] = max(dp[j], dp[j - nums[i]] + nums[i])
return dp[maxn] == maxn
相关文章
- python运行代码不成功_Python | PyCharm无法直接运行(Run)脚本
- Python抓取数据_python抓取游戏数据
- python requests json开发者人员工具实现窃取api接口调用
- 【说站】python电脑桌面中整理exe程序
- Python标识符的命名规则,下列哪些是对的?_python标识符不能使用关键字
- python udp编程_Python核心编程
- 关于python中lambda函数的描述_Python全局变量
- python 图像处理库_Python图像处理库
- python encode和decode傻傻分不清楚「建议收藏」
- 基于Python实现WEB日志生成
- 基于python的OpenCV人脸识别模型
- 【代码】利用Python每天自动发新闻到邮箱
- Python TCP服务器v1.7 - PyQt5 server服务端来临
- 获得进程内存使用量的Python脚本详解编程语言
- Python学习:6.python内置函数详解编程语言
- 掌握Linux环境下的Python编程(linux执行python)
- 安装Python MySQL驱动之快速指南(python安装mysql驱动)
- Python与MongoDB 无缝连接(python连接mongodb)
- 从Python连接Oracle数据库介绍(python连接oracle)
- Linux环境下Python开发的历程(linux与python)
- 2款Python内存检测工具介绍和使用方法