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

【Leetcode】背包问题-416. 分割等和子集

【Leetcode】背包问题-416. 分割等和子集

题目

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

思路

  • 如果可以分割等和子集 那么背包中正好装下一半的数值 sum / 2
  • 背包要放进的物品是元素的数值,价值也是元素的数值
  • 每一个元素只能放入一次
  • 确定dp数组 的含义
  • dp[j]表示容量为j的背包最大容量的物品价值
  • 确定一维dp数组推导公式
  • dp[j] = max(dp[j],dp[j - nums[i]] + nums[i]);
  • 题目给出的元素都是正整数 所以dp数组全部初始化为0 如果有负数 全部初始化为负无穷
  • 保证dp数组在递归公式中取得是最大值 而不是被初始值覆盖

代码

class Solution {
public:
    bool canPartition(vector<int>& nums) {
        // 如果可以分割等和子集 那么背包中正好装下一半的数值 sum / 2
        // 背包要放进的物品是元素的数值,价值也是元素的数值
        // 每一个元素只能放入一次

        // 计算目标数值 target  = sum / 2
        int sum = 0;
        for(int i = 0; i < nums.size(); i++)
        {
            sum += nums[i];
        }

        if(sum % 2 == 1)
        {
            return false;
        }

        int target = sum / 2;

        // 确定dp数组 的含义
        // dp[j]表示容量为j的背包最大容量的物品价值
        vector<int> dp(10001,0);

        // 确定一维dp数组推导公式
        // dp[j] = max(dp[j],dp[j - nums[i]] + nums[i]);
        // 题目给出的元素都是正整数  所以dp数组全部初始化为0  如果有负数 全部初始化为负无穷
        // 保证dp数组在递归公式中取得是最大值  而不是被初始值覆盖

        // 先遍历Nums数组  在遍历背包 这里的bagWeight = 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;
        
    }
};

相关文章:

  • 【算法作业】实验五-2:一元三次方程的根-连续区间的二分搜索求近似解
  • 京东面试——算法工程师
  • 【C#】【平时作业】习题-12-事件
  • 文件IO(刷BMP格式图片、JPG格式图片)
  • 矩阵顺时针反转
  • arm-2d移植到OneOS上的使用
  • 文章说明86145B安捷伦光学分析仪86145B
  • 网课答案查题功能调用接口
  • 『Halcon与C#混合编程』012_迈德威视工业相机SDK入门
  • 以太坊合并可能会引发的雪崩
  • 记一次Prometheus监控下的“内存飙升”事件
  • Linux——进程操作之创建
  • 葡聚糖-聚乙烯亚胺Dextran-PEI,聚乙烯亚胺修饰纤维二糖/香菇多糖/辣根过氧化氢酶/溶菌酶
  • 浙大MBA网上报名关键信息点提醒,选错一个,回头重来
  • 本地git操作-之分支合并与回滚
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • Druid 在有赞的实践
  • export和import的用法总结
  • iOS 颜色设置看我就够了
  • JavaScript-Array类型
  • Java读取Properties文件的六种方法
  • js作用域和this的理解
  • laravel 用artisan创建自己的模板
  • React+TypeScript入门
  • SQLServer之索引简介
  • 大型网站性能监测、分析与优化常见问题QA
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 深度解析利用ES6进行Promise封装总结
  • 从如何停掉 Promise 链说起
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • # include “ “ 和 # include < >两者的区别
  • (06)金属布线——为半导体注入生命的连接
  • (70min)字节暑假实习二面(已挂)
  • (python)数据结构---字典
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (论文阅读11/100)Fast R-CNN
  • (学习日记)2024.01.09
  • (一)kafka实战——kafka源码编译启动
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (转)大型网站架构演变和知识体系
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • (转载)虚函数剖析
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • .form文件_SSM框架文件上传篇
  • .Net Winform开发笔记(一)
  • .net 程序发生了一个不可捕获的异常
  • .net 后台导出excel ,word
  • .NET分布式缓存Memcached从入门到实战
  • @Async注解的坑,小心
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • [BT]小迪安全2023学习笔记(第15天:PHP开发-登录验证)