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. POJ - 2387 Til the Cows Come Home (最短路入门)

    Bessie is out in the field and wants to get back to the barn to get as much sleep as possible before ...

  2. python(For 循环语句)

    一.For循环 Python for 循环可以遍历任何序列的项目,如一个列表或者一个字符串或者字典等. 语法模式:for var in sequence: (1)从某个集合(列表等)里顺次取值 #遍历 ...

  3. 编程坑太多,Map 集合怎么也有这么多坑?一不小心又踩了好几个!

    点赞再看,养成习惯,微信搜索『程序通事』,关注就完事了! 点击查看更多历史文章 上一篇 List 踩坑文章中,我们提到几个比较容易踩坑的点.作为 List 集合好兄弟 Map,我们也是天天都在使用,一 ...

  4. YOLACT : 首个实时one-stage实例分割模型,29.8mAP/33.5fps | ICCV 2019

    论文巧妙地基于one-stage目标检测算法提出实时实例分割算法YOLACT,整体的架构设计十分轻量,在速度和效果上面达到很好的trade-off.   来源:[晓飞的算法工程笔记] 公众号 论文: ...

  5. tp5中使用ueditor编辑器保存文本到数据库后回显后显示html标签问题解决办法

    在编辑器ueditor中获取文本,保存到到数据库后为 当在数据库中提取出来,在显示回ueditor编辑器时候,出了问题, html标签都显示出来了 百度了下别人的解决办法是,使用官方提供的api 可是 ...

  6. HTML往div中赋值

    HTML中往div赋值 <div id="mazey">content</div> 使用JavaScript: var mazey=document.get ...

  7. pycharm中的TODO注释用法

    pycharm 中可以在# 后面加TODO提示自己后续的开发动作. 点击pycharm又下角的小标签,会弹出一个列表,选择TODO选项. 进入TODO选项,可以看见所以设置的TODO,选择一个TODO ...

  8. 【Spark】使用java语言开发spark程序

    目录 步骤 一.创建maven工程,导入jar包 二.开发代码 步骤 一.创建maven工程,导入jar包 <properties> <scala.version>2.11.8 ...

  9. Day_13【IO流】扩展案例1_读取项目文件内容并去重

    分析以下需求,并用代码实现: 需求: 读取当前项目下的info1.txt 文件内容如下 : aaaaaaaaaaabbbbbbbbbbbbccdefg 要求将数据去重后写回最终效果 : fgdebca ...

  10. 数据结构学习:二叉查找树的概念和C语言实现

    什么是二叉查找树? 二叉查找树又叫二叉排序树,缩写为BST,全称Binary Sort Tree或者Binary Search Tree. 以下定义来自百度百科: 二叉排序树或者是一棵空树,或者是具有 ...