[刷题] 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个元素的和的取值范围是[ ...
随机推荐
- CodeForces CF875C题解
题解 非常有意思的\(2-SAT\)的题. 听学长讲完之后感觉确实容易想到\(2-SAT\),顺理成章. 显然,对于两个串,对咱们来说有意义的显然是两个串中第一个不同的数字.那么,我们假设两个串分别是 ...
- Scrapy 5+1 ——五大坑附送一个小技巧
笔者最近对scrapy的学习可谓如火如荼,虽然但是,即使是一整天地学习下来也会有中间两三个小时的"无效学习",不是笔者开小差,而是掉进了深坑出不来. 在此,给各位分享一下作为一名S ...
- centos 7升级gcc到10.2.0
安装gcc 由于 Linux 操作系统的自由.开源,在其基础上衍生出了很多不同的 Linux 操作系统,如 CentOS.Ubuntu.Debian 等.这些 Linux 发行版中,大多数都默认装有 ...
- SpringBoot整合阿里云OSS对象存储实现文件上传
1. 准备工作: 一.首先登录阿里云OSS对象存储控制台创建一个Bucket作为你的存储空间. 二.创建Access Keyan按要求创建进行,这里的方法步骤我就不展现出来了,你们可以自行查询阿里云文 ...
- (十九)VMware Harbor 详细介绍
一 . 简介 Harbor是VMware公司开源的企业级DockerRegistry项目,项目地址为https://github.com/vmware/harbor.其目标是帮助用户迅速搭建一个企业级 ...
- 《MySQL必知必会》学习笔记整理
简介 此笔记只包含<MySQL必知必会>中部分章节的整理笔记.这部分章节主要是一些在<SQL必知必会>中并未讲解的独属于 MySQL 数据库的一些特性,如正则表达式.全文本搜索 ...
- C++ 内存模型之单独编译
单独编译得意义 将一个程序分成多个文件按保存,如果过对程序修改,找到要修改得文件进行修改后重新编译,则可以之重新编译该文件,然后后将他于其他文件得编译版本链接,是的大程序得管理更加高效便捷. 将单文件 ...
- Day01_10_Scanner 接收用户输入
Scanner函数 import java.util.Scanner; class ScannerTest { public static void main(String[] args){ Syst ...
- 网页解析:Xpath 与 BeautifulSoup
1. Xpath 1.1 Xpath 简介 1.2 Xpath 使用案例 2. BeautifulSoup 2.1 BeautifulSoup 简介 2.2 BeautifulSoup 使用案例 1) ...
- 邮件功能 - yagmail 模块
简介 使用 yagmail 模块可以更简单地实现邮件发送功能. 安装:pip install yagmail 代码示例 1 import yagmail 2 3 def send_mail(repor ...