416. 分割等和子集

已知是个背包问题,由于可以等分为两部分,所以必定是个偶数。

一开始想到的是回溯法

    bool helper(vector<int>&nums, int i, int sum,int t)
{
if(sum==t)
return true;
if(i==nums.size())
return false;
else{
if(sum+nums[i]<=t)
return helper(nums,i+1,sum+nums[i],t)||helper(nums,i+1,sum,t);
else
return helper(nums,i+1,sum,t); }
}
bool canPartition(vector<int>& nums) {
int s=0;
for(int i:nums)
s+=i;
if(s&1==1)
return false;
int target=s/2;
return helper(nums,0,0,target);
}

但是这个方法存在重复计算,时间复杂度不过关,如何避免重复计算呢?每位加与不加一共有2种可能,怎么利用记忆化?必须记忆的有,和是多少;然后还需要记忆已经用了哪些数字,不能重复加自己。首先得熟悉背包问题的思想。但是背包问题是求最大值,想不到怎么转换过去。直接看答案。。。(逃

其实从递归方程应该可见端倪,递归考虑的是加和不加数字,然后递归的变量是布尔型变量,所以对于第$i$个数字,状态转移方程就很明显了

建立的状态是dp[i][j]i及之前的数字,能否组成j,故dp[i][j]=dp[i-1][j]||dp[i-1][j-nums[i]]

    bool canPartition(vector<int>& nums) {
int s=0;
for(int i:nums)
s+=i;
if(s&1==1||nums.size()==1)
return false;
int target=s/2;
vector<vector<bool>> dp(nums.size(),vector<bool>(target+1,false));
int len=nums.size();
dp[0][nums[0]]=true;
for(int i=1;i<len;i++)
{
for(int j=0;j<=target;j++)
{
if(j>=nums[i])
dp[i][j]=dp[i-1][j]||dp[i-1][j-nums[i]];
else
dp[i][j]=dp[i-1][j];
}
if(dp[i][target]==true)
return true;
}
return dp[len-1][target];
}

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

  1. Java实现 LeetCode 416 分割等和子集

    416. 分割等和子集 给定一个只包含正整数的非空数组.是否可以将这个数组分割成两个子集,使得两个子集的元素和相等. 注意: 每个数组中的元素不会超过 100 数组的大小不会超过 200 示例 1: ...

  2. Leetcode 416.分割等和子集

    分割等和子集 给定一个只包含正整数的非空数组.是否可以将这个数组分割成两个子集,使得两个子集的元素和相等. 注意: 每个数组中的元素不会超过 100 数组的大小不会超过 200 示例 1: 输入: [ ...

  3. [LeetCode]494. 目标和、416. 分割等和子集(0-1背包,DP)

    题目一 494. 目标和 给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S.现在你有两个符号 + 和 -.对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前 ...

  4. LeetCode:分割链表【86】

    LeetCode:分割链表[86] 题目描述 给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前. 你应当保留两个分区中每个节点的初始相对位置. 示例 ...

  5. LeetCode 数组分割

    LeetCode 数组分割 LeetCode 数组怎么分割可以得到左右最大值的差值的最大 https://www.nowcoder.com/study/live/489/1/1 左右最值最大差 htt ...

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

    Given a non-empty array containing only positive integers, find if the array can be partitioned into ...

  7. [leetcode]416. Partition Equal Subset Sum分割数组的和相同子集

    Given a non-empty array containing only positive integers, find if the array can be partitioned into ...

  8. LeetCode 90. Subsets II (子集合之二)

    Given a collection of integers that might contain duplicates, nums, return all possible subsets. Not ...

  9. [Swift]LeetCode416. 分割等和子集 | Partition Equal Subset Sum

    Given a non-empty array containing only positive integers, find if the array can be partitioned into ...

随机推荐

  1. 图论--树的重心(DFS) 模板

    const int maxn=500005; int tot=0,n; int ans,size; int sx[maxn],head[maxn]; int vis[maxn]; struct edg ...

  2. CF1316C Primitive Primes

    CF1316C [Primitive Primes] 给出两个多项式\(a_0+a_1x+a_2x^2+\dots +a_{n-1}x^{n-1}\)和\(b_0+b_1x+b_2x^2+ \dots ...

  3. linux进程管理相关命令

    ps ps aux ps -ef | grep -E "supervisor|PPID"  top 可以按一定规则对top的结果进行排序 # 监控单一进程 top -p pid  ...

  4. 关于MySQL数据库的卸载

    首先对于MySQL这款数据库来讲,不能简单的卸载就草草了事,我们首先在mysql的文件下面找到my.ini这个文件, 在其中找到mysql数据库所产生的data文件,这个文件一般在c盘的一个隐藏目录下 ...

  5. Flutter 首页必用组件NestedScrollView

    老孟导读:昨天Flutter 1.17版本重磅发布,新的版本主要是优化性能.修复bug,有人觉得此版本毫无亮点,但也从另一方面体现了Flutter目前针对移动端已经较为完善,想了解具体内容,文末有链接 ...

  6. 网络流二十四题,题解summary

    没有全部写完,有几题以后再补吧. 第一题:最简单的:飞行员配对方案问题 讲讲这个题目为什么可以用网络流? 因为这个题目是要进行两两之间的匹配,这个就可以想到用二分图匹配,二分图匹配又可以用网络流写. ...

  7. LTE基站开局流程脚本的具体含义

    1.全局参数配置MOD ENODEB(修改基站): ENODEBID=2015(基站标识2015), NAME="安职-1"(基站名称), ENBTYPE=DBS3900_LTE( ...

  8. 随笔 - B树算法实现

    写代码之前,再回顾一下B树是什么,满足什么样的规则 B树规则: 排序方式:所有节点关键字是按递增次序排列,并遵循左小右大原则 子节点数:非叶节点的子节点数>1,且<=M ,且M>=2 ...

  9. Java语言简介、基础组成、封装、继承、多态、抽象类、内部类、接口

    目录 Java简介 Java语言基础组成 面向对象 对象 封装 构造函数 this关键字 static(静态关键字) 主函数 静态什么时候用呢? 面向对象(数组工具对象建立) 设计模式 继承 成员变量 ...

  10. 我的linux学习日记day5

    一.vim 编辑器 有三种模式,命令模式,输入模式,末行模式 1.下面是命令模式常用的命令 2.末行模式常用命令 :w 保存 :q 退出 :q! 强制退出 :wq! 强制保存退出 :set nu 显示 ...