[刷题] 416 Partition Equal Subset Sum
要求
- 非空数组的所有数字都是正整数,是否可以将这个数组的元素分成两部分,使得每部分的数字和相等
- 最多200个数字,每个数字最大为100
示例
- [1,5,11,5],返回 true
- [1,2,3,5],返回 false
思路
- 在n个物品中选出一定物品,填满sum/2的背包
- 状态:F(n,C)
- 转移:F(i,c)=F(i-1,c) || F(i-1,c-w(i))
- 复杂度:O(n*sum/2) = O(n*sum)
实现
递归+记忆化搜索(归纳法)
- 16-17:是否计算过

1 class Solution {
2 private:
3 // memo[i][c]表示用索引为[0...i]的元素,是否可以完全填充一个容量为c的背包
4 // -1表示未计算,0表示不可填充,1表示可填充
5 vector<vector<int>> memo;
6
7 // 使用nums[0...index],是否可以完全填充一个容量为sum的背包
8 bool tryPartition(const vector<int> &nums, int index, int sum){
9
10 if( sum == 0 )
11 return true;
12
13 if( sum < 0 || index < 0 )
14 return false;
15
16 if( memo[index][sum] != -1 )
17 return memo[index][sum] == 1;
18
19 memo[index][sum] = ( tryPartition(nums, index-1, sum ) ||
20 tryPartition(nums, index-1, sum-nums[index] ) ) ? 1 : 0;
21 return memo[index][sum] == 1;
22 }
23 public:
24 bool canPartition(vector<int>& nums) {
25 int sum = 0 ;
26 for( int i = 0 ; i < nums.size() ; i ++ ){
27 assert( nums[i] > 0 );
28 sum += nums[i];
29 }
30
31 if( sum%2 != 0 )
32 return false;
33
34 memo = vector<vector<int>>( nums.size(), vector<int>(sum/2+1,-1));
35 return tryPartition( nums, nums.size()-1, sum/2 );
36 }
37 };
动态规划(演绎法)
- 采用优化方式,memo为一维数组

1 class Solution {
2
3 public:
4 bool canPartition(vector<int>& nums) {
5 int sum = 0 ;
6 for( int i = 0 ; i < nums.size() ; i ++ ){
7 assert( nums[i] > 0 );
8 sum += nums[i];
9 }
10
11 if( sum%2 != 0 )
12 return false;
13
14 int n = nums.size();
15 int C = sum/2;
16 vector<bool> memo(C+1, false);
17
18 for( int i = 0 ; i <= C ; i ++ )
19 memo[i] = ( nums[0] == i );
20
21 for( int i = 1 ; i < n ; i ++ )
22 for( int j = C ; j >= nums[i] ; j -- )
23 memo[j] = memo[j] || memo[j-nums[i]];
24
25 return memo[C];
26 }
27 };
相关
- 322 Coin Change
- 377 Combination Sum IV
- 474 Ones and Zeros
- 139 Word Break
- 494 Target Sum
[刷题] 416 Partition Equal Subset Sum的更多相关文章
- LN : leetcode 416 Partition Equal Subset Sum
lc 416 Partition Equal Subset Sum 416 Partition Equal Subset Sum Given a non-empty array containing ...
- [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 ...
- 416. Partition Equal Subset Sum
题目: Given a non-empty array containing only positive integers, find if the array can be partitioned ...
- [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 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS 动态规划 日期 题目地址:https://l ...
- LC 416. Partition Equal Subset Sum
题目 Given a non-empty array containing only positive integers, find if the array can be partitioned i ...
- 416 Partition Equal Subset Sum 分割相同子集和
详见:https://leetcode.com/problems/partition-equal-subset-sum/description/ C++: class Solution { publi ...
- 【leetcode】416. Partition Equal Subset Sum
题目如下: 解题思路:对于这种判断是否的题目,首先看看动态规划能不能解决.本题可以看成是从nums中任选i个元素,判断其和是否为sum(nums)/2,很显然从nums中任选i个元素的和的取值范围是[ ...
随机推荐
- 体验用yarp当网关
Yarp是微软开源的一个用.net实现的反向代理工具包,github库就叫reverse-proxy(反向代理)(吐槽一下微软起名字233333) nuget包preview9之前都叫Microsof ...
- Java入门环境的搭建
入门环境搭建 Java帝国的诞生 C & C++ 1972年C诞生 贴近硬件,运行极快,效率极高 操作系统,编译器,数据库,网络系统等 指针和内存管理 1982年C++诞生 面向对象 兼容C ...
- 重磅!解锁Apache Flink读写Apache Hudi新姿势
感谢阿里云 Blink 团队Danny Chan的投稿及完善Flink与Hudi集成工作. 1. 背景 Apache Hudi 是目前最流行的数据湖解决方案之一,Data Lake Analytics ...
- 开篇:ISP基本模块介绍
一般来说,ISP pipeline没有非常严格的流程,各家厂商具体实现方案或多或少都有些差异,但大致流程如下图所示.其中,又可以根据处理的数据将其分成BPS(Bayer process segment ...
- Ambassador-09-prefix正则表达式
设置 prefix_regex: true,即prefix就可以设置成正则表达式 --- apiVersion: getambassador.io/v2 kind: Mapping metadata: ...
- 9. VUE 常用正则表达式
1. 判断输入是否是数字 var numReg = /^[0-9]+$/ var numRe = new RegExp(numReg) if (!numRe.test(number)) { this. ...
- 3、带你一步一步学习ASP.NET Core中的配置之Configuration
如果你是刚接触ASP.NET Core的学习的话,你会注意到:在ASP.NET Core项目中,看不到.NET Fraemwork时代中的web.config文件和app.config文件了.那么你肯 ...
- 粗浅聊聊Python装饰器
浅析装饰器 通常情况下,给一个对象添加新功能有三种方式: 直接给对象所属的类添加方法: 使用组合:(在新类中创建原有类的对象,重复利用已有类的功能) 使用继承:(可以使用现有类的,无需重复编写原有类进 ...
- Android敲诈者病毒“安卓性能激活”分析(2015年9月版)
一.情况简介 前几天分析了论坛里的一个Android敲诈者病毒,感觉还是很有收获,后面有空多研究研究Android病毒.说句题外话, 根据前面分析的Android敲诈者病毒的隐藏手法,应该可以实现&q ...
- 利用ICMP进行命令控制和隧道传输
目录 使用ICMP进行命令控制 使用ICMP搭建隧道 使用ICMP进行命令控制 攻击机:Kali 192.168.10.11 靶机:Windows 192.168.10.1 使用的工具:icmpsh ...