Leetcode每日一题:416.partition-equal-subset-sum(分割等和子集)
思路:这题从动态规划的思想上来看很像0-1背包问题,后者需要小于等于背包容量的条件下价值最大化,这里则是刚好等于数组之和的一半;
1°,要想满足条件,数组之和sum
必须为偶数,并且目标值target=sum/2
,所要做的就是在数组中找到若干个元素,使之和为target
;
2°,建立动态规划模型,bool dp[len][taeget+1]中,dp[i][j]的值表示数组[0,i]中是否存在若干个元素的和为j
;
3°,边界条件{对于所有dp[i][0]=true,因为数组[0,i]我都可以不选从而达到j=0的条件} {dp[0][nums[0]]=true,选择数组第一个元素(nums[0])能让j=nums[0]满足}
4°,对于dp[i][j]
的取值有以下两种情况:
- 如果
j<nums[i]
,那么nums[i]
必不能选,选了就超过j了 =>dp[i][j]=dp[i-1][j]
- 如果
j>=nums[i]
,那么nums[i]
可选可不选 =>df[i][j]=dp[i-1][j](不选)||dp[i-1][j-nums[i]](选)
5°,最后return dp[len-1][target]
即可
详细版可看题解=>力扣官方题解
class Solution {public:bool canPartition(vector<int> &nums){int len = nums.size();if (len < 2)return false;if (len == 2 && nums[0] != nums[1])return false;int sum = 0, target = 0;for (int i = 0; i < len; i++){sum += nums[i];}if (sum & 1) //如果sum是奇数,直接return false{return false;}else //如果是偶数,说明可能为true 可能为false,如果能凑出若干整数使它们和为sum/2,说明为true{target = sum / 2;}//dp[i][j]标识从数组[0,i]下标范围内选区若干整数(可以是0个),是否存在一种方案使得被选取得正整数和等于jbool **dp = new bool *[len];for (int i = 0; i < len; i++){dp[i] = new bool[target + 1];for (int j = 0; j < target + 1; j++){dp[i][j] = false;}}//边界条件1:对于所有j=0,dp[i][0]=true,因为我可以选0个达到j=0;for (int i = 0; i < len; i++){dp[i][0] = true;}//边界条件2:当i=0时,只有1个整数(nums[0])能被选到,所以dp[0][nums[0]]=truedp[0][nums[0]] = true;for (int i = 1; i < len; i++){for (int j = 1; j < target + 1; j++){//如果j>=nums[i],则nums[i]可选可不选if (j >= nums[i]){// 选nums[i] 不选nums[i]dp[i][j] = dp[i - 1][j - nums[i]] || dp[i - 1][j];}//如果j<nums[i],则说明nums[i]必不能选else{dp[i][j] = dp[i - 1][j];}}}return dp[len - 1][target];}
};
Leetcode每日一题:416.partition-equal-subset-sum(分割等和子集)相关推荐
- leetcode 416. Partition Equal Subset Sum | 416. 分割等和子集(Java)
题目 https://leetcode.com/problems/partition-equal-subset-sum/ 题解 乍一看是背包问题,但不同的是,本题要求结果等于某值,背包要求结果小于某值 ...
- 【leetcode】416. Partition Equal Subset Sum
题目如下: 解题思路:对于这种判断是否的题目,首先看看动态规划能不能解决.本题可以看成是从nums中任选i个元素,判断其和是否为sum(nums)/2,很显然从nums中任选i个元素的和的取值范围是[ ...
- LeetCode Partition Equal Subset Sum(动态规划)
问题:给出一个数组,问是否可以分成两个子集,其和相等 思路:首先要求数组和是偶数,然后用动态规划来求. 用dp(i,j)表示第i步时和为j是否可行,则有dp(i,j)= dp(i-1,j) || dp ...
- LeetCode每日一题 416. 分割等和子集
题目链接 思路 转化成背包问题 class Solution {public:bool canPartition(vector<int>& nums) {if (nums.size ...
- leetcode416. Partition Equal Subset Sum
题目要求 Given a non-empty array containing only positive integers, find if the array can be partitioned ...
- leetcode每日刷题计划-简单篇day8
leetcode每日刷题计划-简单篇day8 今天是纠结要不要新买手机的一天QAQ想了想还是算了吧,等自己赚钱买,加油 Num 70 爬楼梯 Climbing Stairs class Solutio ...
- Leetcode每日一题:171.excel-sheet-column-number(Excel表列序号)
思路:就是168题的反命题,进制的方式完美解决: Leetcode每日一题:168.excel-sheet-column-title(Excel表名称) class Solution {public: ...
- 【LeetCode每日一题】1723. 完成所有工作的最短时间
[LeetCode每日一题]1723. 完成所有工作的最短时间 [1] 1723. 完成所有工作的最短时间 [2] 473. 火柴拼正方形 [1] 1723. 完成所有工作的最短时间 题目: 给你一个 ...
- leetcode每日一题--雀巢原理;抽屉算法;Quorum机制;分布式应用
leetcode每日一题 539. 最小时间差 示例 1: 输入:timePoints = ["23:59","00:00"] 输出:1 示例 2: 输入:ti ...
- LeetCode每日一题——1812. 判断国际象棋棋盘中一个格子的颜色
LeetCode每日一题系列 题目:1812. 判断国际象棋棋盘中一个格子的颜色 难度:简单 文章目录 LeetCode每日一题系列 题目 示例 思路 题解 题目 给你一个坐标 coordinates ...
最新文章
- vrrp preempt mode configed in keepalived conf
- python爬虫工程师-记录一下自己找“python爬虫工程师实习生”岗位的经历
- 数据可视化的开源方案: Superset vs Redash vs Metabase (一)
- (转载)grep的使用
- [html] 字体图标加载出来成了小方块,是什么原因呢?如何解决?
- 软考信息安全工程师学习笔记汇总
- 关于EXCEL相关类的一些函数解释
- iPhone 13供需接近平衡,iPhone 13 Pro交付时间较长
- HAProxy负载均衡代理
- Web前端实现锁屏/解锁功能
- 如何制定个人理财计划_如何根据经济状况做个人投资理财计划?
- Spring boot设置文件上传大小限制
- vue源码解析-实现
- 软件测试工具Autorunner的基本使用方法
- php自动生成word目录,word目录自动生成,word如何自动生成目录
- 数的变幻(小明买书)
- 洛谷——P1724 东风谷早苗
- 进程管理API之find_get_pid
- wps“公式编辑器”的MT Extra 字体无效,将无法显示和打印某些字体。请重新安装“公式编辑器”,以便正确安装其字体
- HMM(隐马尔可夫)
热门文章
- C++并发编程之std::future
- Myslq 之创建数据表
- SpringBoot+MyBatis+Mysql 6.X 版本日期型数据获,时间错乱,jason序列化时间相差8小时问题...
- 第四章:Django模型——添加 Event发布会的表 报错
- 160906、Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
- 测试思想-验收测试 关于验收测试
- Perl 标量的操作符
- iis5.1配置php运行环境
- Windows下Android开发环境搭建和配置
- 二十、SAP中定义内表