[刷题] 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个元素的和的取值范围是[ ...
随机推荐
- 经典变长指令ModR/M
变长指令 不是所有的指令都是,看到opcode就知道有多长(定长指令),当指令中出现内存操作对象的时候,就需要在操作码后面附加一个字节来进行补充说明,这个字节被称为ModR/M. 该字节的8个位被分成 ...
- BUAA_OS lab4 难点梳理
BUAA_OS lab4 难点梳理 lab4体会到了OS难度的飞升.实验需要掌握的重点有以下: 系统调用流程 进程通信机制 fork 本lab理解难度较高,接下来将以以上三部分分别梳理. 系统调用 概 ...
- SpringBoot(九篇)
(一) SpringBootCLI安装 (二)SpringBoot开发第一个应用 (三)SpringBoot pom.xml配置文件详解 (四)SpringBoot起步依赖Starters详解 (五) ...
- 动态语言 VS 静态语言
静态语言 VS 动态语言 动态语言 是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化.通俗点说就是在运行时代码可以根据某些条件改变自 ...
- day-6 xctf-hello_pwn
xctf-hello_pwn 题目传送门:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&i ...
- 通过Fiddler 远程 对 安卓手机 iPhone 苹果手机 访问请求抓包 Android IOS14.4 fiddler代理 无法联网
Fiddler 中的设置 1 查看 Fiddler所在 电脑的内网 ip地址. (cmd > ipconfig 查看本机ipv4地址) 2 Fiddler 设置 允许远程设备连接: Fiddl ...
- User-Agent大全 python
1 # -*-coding:utf-8 -*- 2 3 import random 4 5 # 返回一个随机的请求头 headers 6 def getheaders(): 7 # 各种PC端 8 u ...
- Go-26-Json
JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式,因简单.可读性强被广泛使用. Go的标准包encoding/json对JSO ...
- 吉特日化MES&WMS系统--三色灯控制协议转http
关于硬件控制大部分都是使用CS客户端程序,一般连接口都是用网口,串口,USB口等,应用通讯是不支持HTTp协议操作的,而目前一般做技术的人员都在于BS开发,使用HTTP 协议,所以在硬件交互上可能觉得 ...
- Trees on the level UVA - 122
Trees are fundamental in many branches of computer science (Pun definitely intended). Current stateo ...