给你一个 只包含正整数非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。

示例 1:输入:nums = [1,5,11,5]
输出:true
解释:数组可以分割成 [1, 5, 5] 和 [11] 。示例 2:输入:nums = [1,2,3,5]
输出:false
解释:数组不能分割成两个元素和相等的子集。

提示:

  • 1 <= nums.length <= 200
  • 1 <= nums[i] <= 100

思路:经典的 01 背包问题。把 nums[i] 看成第 i 个背包的重量,dp[i][j] 表示能不能从前 i 个背包里选出一些背包,使背包的重量总和刚好为 j。
  对于每个背包有两种可能:1.选择;2.不选择。
  1.当不选择背包 i 的时候,前 i 个背包能不能组成和为 j,要看前 i - 1 个背包能不能组成和为 j。
    dp[i][j] = dp[i - 1][j];
  2.当选择背包 i 的时候,前 i 个背包能不能组成和为 j,要看前 i - 1 个背包能不能组成和为 j - nums[i - 1]。nums[i - 1] 是第 i 个背包的重量。
    dp[i][j] = dp[i - 1][j - nums[i - 1]];
  因为是求可能性,两种结果有一个为真就行。

bool canPartition(vector<int>& nums) {int n = nums.size();int sum = accumulate(nums.begin(), nums.end(), 0);if (sum % 2)return false;vector<vector<int>> dp(n + 1, vector<int>(sum / 2 + 1)); // dp[i][j] 表示前 i 个数能不能组成和为 jdp[0][0] = 1;for (int i = 1; i <= n; i++) {for (int j = 0; j <= sum / 2; ++j) {dp[i][j] = dp[i - 1][j]; if (j >= nums[i - 1])dp[i][j] |= dp[i - 1][j - nums[i - 1]];}}return dp[n][sum / 2];
}

dp[i][…] 只和 dp[i - 1][…] 有关,空间上可以进行优化

bool canPartition(vector<int>& nums) {int n = nums.size();int sum = accumulate(nums.begin(), nums.end(), 0);if (sum % 2)return false;vector<int> dp(sum / 2 + 1); // dp[j] 表示前 i 个数能不能组成和为 jdp[0] = 1;for (int i = 1; i <= n; i++) {for (int j = sum / 2; j > 0; --j) {if (j >= nums[i - 1])dp[j] |= dp[j - nums[i - 1]];}}return dp[sum / 2];
}

LeetCode | 416.分割等和子集相关推荐

  1. LeetCode 416 分割等和子集

    LeetCode 416 分割等和子集 题目链接 给定一个只包含正整数的非空数组.是否可以将这个数组分割成两个子集,使得两个子集的元素和相等. 注意: 每个数组中的元素不会超过 100 数组的大小不会 ...

  2. leetcode - 416. 分割等和子集

    416. 分割等和子集 -------------------------------------------- 给定一个只包含正整数的非空数组.是否可以将这个数组分割成两个子集,使得两个子集的元素和 ...

  3. LeetCode 416. 分割等和子集 【c++/java详细题解】

    来自专栏<LeetCode高频面试题> 欢迎订阅 目录 1.题目 2.思路 3.二维c++代码 4.二维java代码 5.一维优化 6.一维c++代码 7.一维java代码 1.题目 给你 ...

  4. Java实现 LeetCode 416 分割等和子集

    416. 分割等和子集 给定一个只包含正整数的非空数组.是否可以将这个数组分割成两个子集,使得两个子集的元素和相等. 注意: 每个数组中的元素不会超过 100 数组的大小不会超过 200 示例 1: ...

  5. [动态规划] leetcode 416. 分割等和子集

    问题描述:    分割等和子集:给你一个只包含正整数的非空数组 nums .请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等.   例子:输入nums = {1, 5, 11 , 5 ...

  6. leetcode 416. 分割等和子集

    分割等和子集题解集合 DFS 记忆化搜索 记忆化搜索的另一种写法 动态规划 「滚动数组」解法 「一维空间优化」解法 DFS 思路 题意就是:给你一个非空数组,和为sum,你能否找到一个子序列,和为su ...

  7. LeetCode 416. 分割等和子集(动态规划)

    1. 题目 给定一个只包含正整数的非空数组. 是否可以将这个数组分割成两个子集,使得两个子集的元素和相等. 注意: 每个数组中的元素不会超过 100 数组的大小不会超过 200 示例 1: 输入: [ ...

  8. LeetCode 416. 分割等和子集(动态规划)(0-1背包)

    题目描述 给定一个只包含正整数的非空数组.是否可以将这个数组分割成两个子集,使得两个子集的元素和相等. 注意: 每个数组中的元素不会超过 100 数组的大小不会超过 200 示例 1: 输入: [1, ...

  9. LeetCode #416 分割等和子集

    题目: 给你一个 只包含正整数 的 非空 数组 nums .请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等. 示例 1: 输入:nums = [1,5,11,5] 输出:true ...

最新文章

  1. HDU 5115 Dire Wolf ——(区间DP)
  2. 《Storm实时数据处理》一2.6 统计与持久化日志统计信息
  3. fitype拟合多参数函数和遗传算法拟合多参数函数
  4. pccs色卡_NCS色彩体系与PCCS色彩体系如何关联使用
  5. android监听器作用,android - 监听器和接收器(Android)有什么区别?
  6. c语言 数据结构 list、queue、tree抽象数据类型的定义与实现 详尽代码和注释
  7. 16款测序平台性能大PK,华大表现不俗!基于人类和细菌基因组DNA水平的多平台测序数据研究成果发布...
  8. Nodejs 博客系统遇到的问题及解决
  9. mysql的缓存机制是什么意思_MySQL缓存机制详解
  10. BOOST库介绍(二)——BOOST多线程相关库
  11. Java实现的各种排序算法
  12. Python格式化输出总结
  13. thinkphp mysql order_ThinkPHP中order()的使用方法
  14. 图文模态交互 | CLIP + GAN = ?
  15. 比较计算机动画与传统动画的异同,定格动画和传统动画有什么区别?基本一样吧?...
  16. HIbernate关联映射小案例(CRUD)
  17. 巴比特 | 元宇宙每日必读:蒂芙尼宣布推出限量版 CryptoPunk 定制吊坠
  18. MobaXterm 全能型开源远程终端
  19. 我的专业和梦想计算机,2019,我们有很厉害的梦想与计划
  20. kinova-Mico安装与调试

热门文章

  1. php 解析网页慢,网页访问变慢的原因分析及优化
  2. 4.25学习笔记 哈希表
  3. Web前端开发-边框设置
  4. java校验视频文件格式
  5. 第七十五章 SQL函数 LEFT
  6. mysql left join_MySQL LEFT JOIN 语法用法与实例
  7. android/iPhone:如何从browser直接打开应用程序或者打开应用商店(如果没有应用程序)
  8. 单点登录无限跳转的问题
  9. 区块链技术在知名平台的应用
  10. 0301 、Web服务器简介、虚拟Web主机、NFS服务基础、触发挂载