Leetcode 416分割等和子集
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分割等和子集的更多相关文章
- Java实现 LeetCode 416 分割等和子集
416. 分割等和子集 给定一个只包含正整数的非空数组.是否可以将这个数组分割成两个子集,使得两个子集的元素和相等. 注意: 每个数组中的元素不会超过 100 数组的大小不会超过 200 示例 1: ...
- Leetcode 416.分割等和子集
分割等和子集 给定一个只包含正整数的非空数组.是否可以将这个数组分割成两个子集,使得两个子集的元素和相等. 注意: 每个数组中的元素不会超过 100 数组的大小不会超过 200 示例 1: 输入: [ ...
- [LeetCode]494. 目标和、416. 分割等和子集(0-1背包,DP)
题目一 494. 目标和 给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S.现在你有两个符号 + 和 -.对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前 ...
- LeetCode:分割链表【86】
LeetCode:分割链表[86] 题目描述 给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前. 你应当保留两个分区中每个节点的初始相对位置. 示例 ...
- LeetCode 数组分割
LeetCode 数组分割 LeetCode 数组怎么分割可以得到左右最大值的差值的最大 https://www.nowcoder.com/study/live/489/1/1 左右最值最大差 htt ...
- [LeetCode] 416. Partition Equal Subset Sum 相同子集和分割
Given a non-empty array containing only positive integers, find if the array can be partitioned into ...
- [leetcode]416. Partition Equal Subset Sum分割数组的和相同子集
Given a non-empty array containing only positive integers, find if the array can be partitioned into ...
- LeetCode 90. Subsets II (子集合之二)
Given a collection of integers that might contain duplicates, nums, return all possible subsets. Not ...
- [Swift]LeetCode416. 分割等和子集 | Partition Equal Subset Sum
Given a non-empty array containing only positive integers, find if the array can be partitioned into ...
随机推荐
- 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 ...
- python(For 循环语句)
一.For循环 Python for 循环可以遍历任何序列的项目,如一个列表或者一个字符串或者字典等. 语法模式:for var in sequence: (1)从某个集合(列表等)里顺次取值 #遍历 ...
- 编程坑太多,Map 集合怎么也有这么多坑?一不小心又踩了好几个!
点赞再看,养成习惯,微信搜索『程序通事』,关注就完事了! 点击查看更多历史文章 上一篇 List 踩坑文章中,我们提到几个比较容易踩坑的点.作为 List 集合好兄弟 Map,我们也是天天都在使用,一 ...
- YOLACT : 首个实时one-stage实例分割模型,29.8mAP/33.5fps | ICCV 2019
论文巧妙地基于one-stage目标检测算法提出实时实例分割算法YOLACT,整体的架构设计十分轻量,在速度和效果上面达到很好的trade-off. 来源:[晓飞的算法工程笔记] 公众号 论文: ...
- tp5中使用ueditor编辑器保存文本到数据库后回显后显示html标签问题解决办法
在编辑器ueditor中获取文本,保存到到数据库后为 当在数据库中提取出来,在显示回ueditor编辑器时候,出了问题, html标签都显示出来了 百度了下别人的解决办法是,使用官方提供的api 可是 ...
- HTML往div中赋值
HTML中往div赋值 <div id="mazey">content</div> 使用JavaScript: var mazey=document.get ...
- pycharm中的TODO注释用法
pycharm 中可以在# 后面加TODO提示自己后续的开发动作. 点击pycharm又下角的小标签,会弹出一个列表,选择TODO选项. 进入TODO选项,可以看见所以设置的TODO,选择一个TODO ...
- 【Spark】使用java语言开发spark程序
目录 步骤 一.创建maven工程,导入jar包 二.开发代码 步骤 一.创建maven工程,导入jar包 <properties> <scala.version>2.11.8 ...
- Day_13【IO流】扩展案例1_读取项目文件内容并去重
分析以下需求,并用代码实现: 需求: 读取当前项目下的info1.txt 文件内容如下 : aaaaaaaaaaabbbbbbbbbbbbccdefg 要求将数据去重后写回最终效果 : fgdebca ...
- 数据结构学习:二叉查找树的概念和C语言实现
什么是二叉查找树? 二叉查找树又叫二叉排序树,缩写为BST,全称Binary Sort Tree或者Binary Search Tree. 以下定义来自百度百科: 二叉排序树或者是一棵空树,或者是具有 ...