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

代码随想录算法训练营第35天 | 416.分割等和子集

代码随想录算法训练营第35天 | 416.分割等和子集

文章目录

  • 代码随想录算法训练营第35天 | 416.分割等和子集
    • 416.分割等和子集
        • 解题思路
        • 代码实现
        • 题目总结


416.分割等和子集

题目链接:416.分割等和子集

解题思路

只要集合中出现 sum/2 的子集总和,那么这个数组就可以分割成两个相同元素的子集。本题可以使用回溯算法暴力搜索出所有答案,但是很费时,考虑将本题转换为背包问题解决。因为元素只能使用一次,所有是0-1背包。

  1. 确定dp数组及下标的含义:dp[j] 表示容量是 j 的背包最大可以凑成的总和
  2. 确定递推公式:dp[j]=max(dp[j],dp[j-nums[i]]+nums[i])
  3. 初始化dp数组:题中给出的价值都是正整数,那么非0下标的数组都初始化为0即可
  4. 确定遍历顺序:一维dp数组,遍历物品的 for 循环在外层,遍历背包的 for 循环在内层,且内层 for 循环使用倒叙遍历
  5. 举例推导dp数组
代码实现
class Solution {
public:
    bool canPartition(vector<int>& nums) {
        int sum = 0;
        vector<int> dp(10001, 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]);
            }
        }
        if (dp[target] == target)
            return true;
        return false;
    }
};
题目总结

本题是一道0-1背包应用类的题目,需要拆解题目,套用0-1背包的场景。


http://www.kler.cn/a/288370.html

相关文章:

  • vue3+elementplus+虚拟树el-tree-v2+多条件筛选过滤filter-method
  • C# WPF FontDialog字体对话框,ColorDialog颜色对话框 引用
  • UVa 11855 Buzzwords
  • 利用编程语言和脚本编写技术,实现自动化渗透测试和安全工具的开发
  • 使用Python实现对接Hadoop集群(通过Hive)并提供API接口
  • 网络基础概念与应用:深入理解计算机网络
  • PLUTO: 推动基于模仿学习的自动驾驶规划的极限
  • AI智能电销机器人的优势是什么,有什么特点?
  • Python群发邮件:如何实现Python邮件群发?
  • 浅谈sizeof() 函数在Arduino中的使用
  • 代码随想录算法训练营_day35
  • ARM 异常处理(21)
  • dfs算法复习
  • Express与SQLite集成教程:轻松实现数据库操作
  • 【概率与统计 动态规划】 808. 分汤
  • Unity3D DOTS系列之BlobAsset核心机制详解
  • UFUG2601-OJ palindrome
  • idea便捷操作
  • Kubernetes 1.20 上将容器从 Docker Engine 改为 Containerd
  • Idea发布springboot项目无法识别到webapp下面的静态资源
  • <数据集>无人机识别数据集<目标检测>
  • 等保2.0通用部分 | 安全物理环境(三级)测评指导书
  • ai数字人音频停顿处理,删除无用音频段
  • 【C++拓展(一)】后端开发常用的技术栈
  • 在随机点实现凸包包围游戏地区
  • 产品概述Tektronix泰克TCP0030A电流探头TCP0030原装二手