当前位置: 首页 > news >正文

分割等和子集

本文参考代码随想录

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

注意: 每个数组中的元素不会超过 100 数组的大小不会超过 200

示例 1:

输入: [1, 5, 11, 5]
输出: true
解释: 数组可以分割成 [1, 5, 5] 和 [11].
示例 2:

输入: [1, 2, 3, 5]
输出: false
解释: 数组不能分割成两个元素和相等的子集.
提示:

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

思路

可以转换成01背包问题:
有一个 只能装重量为 sum / 2 的背包,商品为数字,这些数字能不能把 这个背包装满。一个数字只有一个维度,即 重量等于价值。

  1. 确定dp数组以及下标的含义
    容量(所能装的重量)为j的背包,所背的物品价值最大可以为dp[j]。
  2. 确定递推公式
    dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);
  3. dp数组如何初始化
    首先dp[0]一定是0。本题题目中 只包含正整数的非空数组,所以非0下标的元素初始化为0就可以了。总和不会大于20000,背包最大只需要其中一半,所以10001大小就可以了
  4. 确定遍历顺序
    如果使用一维dp数组,物品遍历的for循环放在外层,遍历背包的for循环放在内层,且内层for循环倒序遍历
class Solution {
public:bool canPartition(vector<int>& nums) {vector<int> dp(10001, 0);int sum = 0;for(int i = 0; i < nums.size(); i++){sum += nums[i];}if(sum % 2 == 1) return false;int target = sum / 2;for(int i = 0; i < nums.size(); i++){for(int j = target; j >= nums[i]; j--){dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);}}return dp[target] == target;}
};
http://www.dtcms.com/a/347542.html

相关文章:

  • React学习(十)
  • 【LeetCode】85. 最大矩形 (暴力枚举)
  • 某铝业智慧工厂网络建设优化方案实践
  • 使用tensorRT10部署yolov5目标检测模型(2)
  • 【深度学习】深度学习中的结构化概率模型:理论、方法与应用
  • Qt从qmake迁移到cmake的记录
  • 【深度学习新浪潮】有哪些工具可以帮助我们对视频进行内容分析和关键信息提取?
  • 从0开始学习Java+AI知识点总结-23.web实战案例(班级和学生增删改查、信息统计)
  • Day58 Java面向对象13 instanceof 和 类型转换
  • 自动化运维Ansible
  • 13.机器学习—— ML特征工程和优化方法
  • CANN安装
  • 电力方向国际期刊推荐
  • 分析 HashMap 源码
  • 《TCP多线程通信代码C语言开发流程解析》
  • redis----hash类型详解
  • 领码方案:新一代页面权限体系全景解析(完整版)
  • Radis安装部署(Linux,Docker)
  • 温度对直线导轨的性能有哪些影响?
  • TypeScript 的泛型(Generics)作用理解
  • 如何优雅解决 OpenCV 分段错误(Segfault):子进程隔离实战
  • 工业企业与海关匹配数据(2000-2013)
  • Unity中删除不及时的问题
  • DeepSeek-V3.1发布,预示下一代国产芯片即将发布,更新一小版本,跨出一大步
  • 深入理解3x3矩阵
  • Java—— 配置文件Properties
  • Spring Boot 实现 POJO 级联封装复杂属性
  • Redis学习笔记 ----- 缓存
  • 寻鲜之旅“咖”约深圳,容声冰箱引领“养鲜”新体验
  • 解决coze api使用coze.workflows.runs.create运行workflow返回400,但text为空