[416]. 分割等和子集

  • 题目
  • 算法设计:动态规划

题目

  • 题目:[416]. 分割等和子集

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


算法设计:动态规划

背包建模:

  • 背包的容量是谁
  • 背包的物品是谁,物品的成本、价值是多少
  • 背包的选取方式是什么

问我们能否将一个数组分成两个「等和」子集。

问题等效于能否从数组中挑选若干个元素,使得元素总和等于所有元素总和的一半。

这道题如果抽象成「背包问题」的话,应该是:

  • 背包容量是: t a r g e t = s u m / 2 target=sum/2 target=sum/2
  • 背包物品是: 数组元素 数组元素 数组元素,每个数组元素的「价值」与「成本」都是其数值大小
  • 背包选取方式是:求解将哪些物品装入背包 恰好装满 恰好装满 恰好装满

设计状态:

  • dp[i][j]:对前 i 个物品,背包容量为 j 时,若 x 为 true,则恰好装满;否则不能恰好装满。

设计 base case:

  • dp[0][...] = false:没有物品,不能装满
  • dp[...][0] = false:背包没有容量,不能装满

设计最终状态:

  • dp[N][sum/2]

设计状态转移方程,最终状态从哪里来:

  • 不装第 N 种物品,dp[N][sum/2] = dp[N-1][sum/2],来自上一件物品的处理结果
  • 装入第 N 种物品,dp[N][sum/2] = dp[N-1][sum/2] || dp[N-1][j-nums[i]],如果装了第 i 种物品,就要看背包剩余容量 j-nums[i] 是否能恰好转满

因为 dp[i][j] 只从 dp[i-1][j]dp[i-1][j-w[i]] 而来,也就是说 [1....j] 这个数组是我们必须存的,但是 dp[1..i-1] 其实是不需要存的,只有 dp[i-1] 是有用的。

那可不可以设计一个一维数组 dp[1....j],来代表 dp[i-1][1.....j] 呢?

  • 可以的,简单来说,既然只需要上一行当前列和前面列的值,只用一个一维数组+倒推就可以了。

  • 具体压缩过程,请看《动态规划二》的 01 背包。

01 背包状态压缩:

bool canPartition(vector<int> &nums) {int sum = accumulate(nums.begin(), nums.end(), 0);if (sum % 2 == 1)              // 如果是和为奇数显然无法分成两个等和子集return false;int target = sum / 2; vector<int> dp(target + 1, 0); // dp[i]: 是否存在子集和为idp[0] = true;                  // 初始化:target=0 不需要选择任何元素,所以是可以实现的for (int num : nums)for (int i = target; i >= num; i--)dp[i] = dp[i] || dp[i - num];return dp[target];
}

[416]. 分割等和子集相关推荐

  1. LeetCode-动态规划背包题-416. 分割等和子集

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

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

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

  3. 416. 分割等和子集

    0-1背包问题:https://blog.csdn.net/qq_40794973/article/details/102701052 416. 分割等和子集 https://leetcode-cn. ...

  4. Suzy心情很差因为被charge了late fee Day42 | 动态规划之背包问题,416. 分割等和子集

    背包问题 01背包 Given n种物品,每种物品只有1个 每个物品有自己的重量.价值. 背包最大能装载的重量 动规五部曲--用二维数组 定义dp数组的含义:dp[ i ][ j ]表示[0,i]物品 ...

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

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

  6. LeetCode 416 分割等和子集

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

  7. 【Leetcode刷题】:Python:416. 分割等和子集

    题目 416. 分割等和子集 代码:dp class Solution:def canPartition(self, nums: List[int]) -> bool:n = len(nums) ...

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

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

  9. day41 | 416. 分割等和子集

    01 背包问题 定义dp数组 dp[i][j]:i 表示 0 - i 之间的物品,任取,放进容量 为 j 的背包里 的最大价值 递推公式: dp[i][j] 由两个方向推出来,即放当前的物品i,与不放 ...

最新文章

  1. bs4爬取的时候有两个标签相同_4.4 爬虫中的bs4数据爬取步骤
  2. Java一行一行的读文件和简单的写文件
  3. C语言实例第4期:交换数组中最大数和最小数的位置
  4. 前端学PHP之面向对象系列第六篇——简单图形面积计算器实现
  5. mysql导入数据库某张表_MSSQLServer2005 导出导入数据库中某张表的数据
  6. mongodb 物理删除数据
  7. Honeycomb——BFS
  8. Oracle标准审计实战过程详解
  9. 小程序如何避免多次点击,重复触发事件
  10. 斐讯k3更新mysql_斐讯K3官改,安装onmp教程,回馈社区。-附TCExam后续安装
  11. 仿 qq音乐播放器 html代码,仿QQ音乐播放器
  12. 电影海王真的好看吗|我爬取了9000条影评,得出的结论是
  13. python饼状图显示其比例_Python学习笔记(matplotlib篇)--使用matplotlib绘制饼状图
  14. java 最大整形_Java大整形BigInteger的用法
  15. CONV SAME CONV VAILD CONV
  16. 手机网页UI框架jQuery Mobile介绍之按钮篇
  17. Conda各平台安装配置和使用Python环境(保姆级教程)
  18. AppImage应用启动报错:Cannot mount AppImage, please check your FUSE setup
  19. Tushare的使用感受
  20. 关于Datatable删除行和删除列

热门文章

  1. 特别关注 | 想给基因取个名儿?也要按照基本法!
  2. 读万卷书行万里路,笔试越来越少,到底怎样才能拿到offer?
  3. Metabase——开源的大数据分析探索、可视化报表神器
  4. 【Vive Pro】眼动安装SR_Runtime
  5. Entity Linking with a Knowledge Base:Issues, Techniques, and Solutions笔记
  6. 智慧监狱解决方案-最新全套文件
  7. 谷歌眼镜设计规范之书写
  8. runit 学习笔记
  9. 美国雷曼兄弟公司简介
  10. AI智能缺陷检测系统