416分割等和子集

题目:给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
注意: 每个数组中的元素不会超过 100,数组的大小不会超过 200
来源:https://leetcode-cn.com/problems/partition-equal-subset-sum/

法一:动态规划

思路:首先写状态转移方程的时候,如果采用类似312戳气球的方法,即由内到外,由小到大,是难以实现的,原因有二,一是假如题目中的数组元素有6个,则dp[1]即长度为1的子集有6个,dp[2]长度为2的子集有15个,dp[3]长度为3的子集有20个,从dp[1]到dp[2]状态转移的过程中无法实现。二是由于长度不等,难以写成dp数组的形式。说到底是因为,dp[i]定义成了长度为i的子集的和,而不同长度的子集间由于子集的个数不同,难以写出状态转移方程。

由此定义dp[i]为nums中从0到i的子集的和,则dp[i+1]从dp[i]转移过来的时候,由于dp[i]的情况很多,由此确定需要二维数组来记录,二维数组的列用来记录所有的和,如果这个和存在记为True,否则为False。

from typing import List
class Solution:
    def canPartition(self, nums: List[int]) -> bool:
        n=len(nums)
        target=sum(nums)
        if(target%2!=0):
            return False
        target//=2
        dp=[[False]*(target+1) for _ in range(n)]
        # 设置边界条件非常重要,将第一列(即和为0的列)设置为True,
        dp[0][0]=True
        # 先遍历第一行
        for i in range(1,target+1):
            if(nums[0]==i):
                dp[0][i]=True
                break
        # 遍历其余行
        for i in range(1,n):
            for j in range(target+1):
                # 如果当前的目标和值大于等于要遍历的值,则将目标和值减去当前值看上一行和为dp[i-1][j-nums[i]]的为True还是False
                if(j>=nums[i]):
                    dp[i][j]=dp[i-1][j] or (dp[i-1][j-nums[i]])
                # 否则说明目标值小于要遍历的值,直接等于上一行的结果
                else:
                    dp[i][j]=dp[i-1][j]
            # 如果最后一列出现True了,说明存在组合成目标值的和.直接返回True
            # if dp[i][-1] == True:
            #     return True
        return dp[-1][-1]
if __name__ == ‘__main__‘:
    duixiang = Solution()
    a = duixiang.canPartition([1, 5, 11, 5])
    print(a)

来源:https://leetcode-cn.com/problems/partition-equal-subset-sum/solution/dong-tai-gui-hua-kong-jian-you-hua-zhu-xing-jie--2/

法二:备忘录方法  非常巧妙

思路:利用ans记录之前的计算结果,每次都和之前的求和后判别是否满足条件。

class Solution:
    def canPartition(self, nums: List[int]) -> bool:
        target, remain = divmod(sum(nums), 2)
        if remain:  # 如果不能整除直接返回
            return False
        ans = {0}
        for i in nums:
            for j in list(ans): # 循环中会改变ans
                j += i
                if j == target:  # 提前结束
                    return True
                ans.add(j)  # 之前的结果加当前数能得到的结果
        return False

ttt

原文地址:https://www.cnblogs.com/xxswkl/p/12238206.html

时间: 2024-10-14 02:00:58

416分割等和子集的相关文章

矩阵与动态规划相关

目录 54/59螺旋矩阵 62不同路径 64最小路径和 120三角形最小路径和 695岛屿的最大面积 547朋友圈 718最长重复数组 221最大正方形 121/122/123/714/188买卖股票的最佳时机 416分割等和子集 01背包/最近等分子集 70爬楼梯 54/59螺旋矩阵 思路: 设置上下左右四个边界变量 新建ArrayList存储结果 循环:四个循环,左->右,上->下,右->左,下->上.每次循环添加结果,循环后判断边界是否相等了,是的话就退出 // 设置边界变量

leet

# 题名1 两数之和    2 两数相加    3 无重复字符的最长子串    4 寻找两个有序数组的中位数    5 最长回文子串    6 Z 字形变换    7 整数反转    8 字符串转换整数 (atoi)    9 回文数    10 正则表达式匹配    11 盛最多水的容器    12 整数转罗马数字    13 罗马数字转整数    14 最长公共前缀    15 三数之和    16 最接近的三数之和    17 电话号码的字母组合    18 四数之和    19 删除链表

优达学城机器学习工程师纳米学位项目介绍

本文由 meelo 原创,请务必以链接形式注明 本文地址,简书同步更新地址 一对一的项目辅导是优达学城(udacity)纳米学位的一大亮点.本文将简要介绍优达学城机器学习工程师纳米学位的6个项目.项目覆盖了机器学习的主要领域,包括回归分析.分类.聚类.增强学习及深度学习. 项目 0: 预测泰坦尼克号乘客生还率 这个项目需要你手动地实现一个简单的机器学习模型——决策树.1912年泰坦尼克号在第一次航行中与冰山碰撞沉没,泰坦尼克号乘客生还数据集记录了之中891个乘客的性别.年龄.社会阶级.配偶数量等

编译原理--01 复习大纲(清华大学出版社第3版)

前言 目前以手中这本清华大学出版社出版的编译原理(第3版,张素琴等编著)作为复习总结,因为考试都是大题,一部分概念会被忽略.所有内容都需要通过举例和推导来帮助加深理解,优先为过几天的考试服务.该文实现了教材中那些特别复杂的推导符号,并且这几天会加紧持续更新. 第2章 文法和语言 符号和符号串 空符号串用\(\varepsilon\)表示,长度为0 若 \(\Sigma=\{0,1\}\) ,则 \(\Sigma^*=\{\varepsilon,0,1,00,11,000,001,...\}\),

第六章、数据库及数据库对象

第六章.数据库及数据库对象 内容提要: 1.了解数据库的组成及特点 2.掌握SQL Server2008的安装与配置 3.掌握数据库的创建及维护方法 4.掌握架构的定义与维护方法 5.掌握分区表.索引及视图的创建及维护方法 第一节.创建及维护数据库 1.1.SQL Server数据库概述 SQL Server的发展史 SQL Server 7.0(1999年,正式跻身企业数据库行列) SQL Server 2000(2000年,代表产品) SQL Server 2005(2005年,代号"Yuk

[LeetCode] Partition Equal Subset Sum 相同子集和分割

Given a non-empty array containing only positive integers, find if the array can be partitioned into two subsets such that the sum of elements in both subsets is equal. Note: Both the array size and each of the array element will not exceed 100. Exam

使用Redis分区将数据分割到多个Redis实例

分区是将所有的数据分割到多个Redis实例的过程,所以每个Redis实例存放的是所有键值的子集. Redis分区主要有两个目标:1)允许使用多台计算机的内存来存放更大的数据.如果不做分区的话,单台计算机的内存又限制. 2)使用多台计算的计算能力和网络带宽. 有许多不同的分区场景, 参考资料: http://redis.io/topics/partitioning

MongoDB分片之数据分割方式

随着移动互联网的发展,大量的非结构化数据随之产生,不仅对数据库存储大数据提出了新的要求,同时对于查询数据和进行大数据分析也提出了苛刻的要求,这些显然是单服务器处理能力无法满足的,自然建立一个集群是不可避免的.集群的复杂性大家众所周知,而MongoDB的优势之一正式可以帮助我们解决这些问题. 分片(sharding) 分片是MongoDB提供的一种机制,其可以将大型的集合分割保存到不同的服务器上.与其他的分区方案相比,MongoDB几乎能自动为我们完成所有事情.只要我们进行简单的配置,并告诉Mon

Leetcode 416. Partition Equal Subset Sum

416. Partition Equal Subset Sum Given a non-empty array containing only positive integers, find if the array can be partitioned into two subsets such that the sum of elements in both subsets is equal. Note: Each of the array element will not exceed 1