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

【力扣hot100题】(088)分割等和子集

果然越来越难了,真的想了好久,最后看答案才发觉这是01背包问题的变种。

先去看了01背包问题,将体积和质量不等的物体塞进容积固定的背包中,求质量最大的装法。方法是维护一个二维数组,两个维度一个代表遍历到第几个物体,一个代表占用空间,数组内容是背包内总质量。每次遍历一个物体,然后遍历上一个物体占用空间,如果剩下的空间能塞入当前物体那进行如下状态转换:

总质量[当前物体][截止至上一个物体占用的空间+该物体占用空间]=总质量[上一物体][截止至上一物体占用的空间]+当前物体质量。

于是这道题也可以用类似的思路。

不过二维数组用bool类型就可以了,只需要检查截止至物体能不能占满这个空间。

状态转换方程:(放入当前物体的情况)

是否能占满[当前物体][截止至上一物体占用的空间+该物体占用的空间]=是否占满[上一物体][截止至上一物体占用的空间]

并且:

是否能占满[当前物体][截止至上一物体占用的空间]=是否占满[上一物体][截止至上一物体占用的空间]

(不放当前物体的情况)

如果上一物体可以占满这个空间,那么加上当前物体就可以占满上一空间+这一物体空间的空间。

这样的话每次都能保留是否放入之前的物体的结果。

class Solution {
public:
    bool canPartition(vector<int>& nums){
        int sum=0;
        for(int i=0;i<nums.size();i++) sum+=nums[i];
        if(sum%2==1) return 0;
        else sum/=2;
        bool a[201][20000];
        memset(a,0,sizeof(a));
        for(int i=1;i<nums.size();i++){
            for(int j=0;j<=sum;j++){
                if(a[i-1][j]==1||j==0){
                    a[i][j]=1;
                    a[i][j+nums[i]]=1;
                }
            }
            if(a[i][sum]==1) return 1;
        }
        return 0;
    }
};

其实应该是可以优化空间复杂度的,因为每个物体只需要用到上一物体的数组。

想了一会怎么才能不重复加入元素最终看了答案,原来从大到小遍历就可以了,这样每次只会加入增大的元素,不会产生重复加入的问题。

class Solution {
public:
    bool canPartition(vector<int>& nums){
        int sum=0;
        for(int i=0;i<nums.size();i++) sum+=nums[i];
        if(sum%2==1) return 0;
        else sum/=2;
        bool a[20000];
        memset(a,0,sizeof(a));
        for(int i=1;i<nums.size();i++){
            for(int j=sum;j>=0;j--){
                if(a[j]==1||j==0) a[j+nums[i]]=1;
            }
            if(a[sum]==1) return 1;
        }
        return 0;
    }
};

相关文章:

  • MySQL-多表查询-自连接联合查询子查询
  • Leetcode131:分割回文串——回溯算法
  • 【Linux】线程池与封装线程
  • apijson 快速上手
  • 5.DJI-PSDK:Psdk开发负载与Msdk的应用app进行交互:
  • Spring Boot 常用依赖介绍
  • 什么是自动化测试?
  • 既然安装了WSL2和Ubuntu,那么怎么和windows传递文件(1)
  • Redis安装与基础配置(Windows及linux)
  • 《Vue Router实战教程》22.导航故障
  • 前端工程化:构建高效可维护的现代Web应用
  • 【特权FPGA】之数码管
  • vscode报错:unins000.exe 尝试在目标目录创建文件时发生一个错误
  • Pyside6使用QtWebEngine实现GUI嵌入网页内容
  • 【愚公系列】《Python网络爬虫从入门到精通》047-验证码识别(第三方验证码识别)
  • DeepSeek 助力 Vue3 开发:打造丝滑的日历(Calendar),日历_基础功能示例(CalendarView01_01)
  • 【ESP32-C6】Base on esptool commands to enable Flash Encryption and Secure Boot
  • 5G中的DU和CU的作用
  • 【C++篇】C++模板初阶:从泛型编程到函数模板与类模板的全面解析
  • 【closerAI ComfyUI】nunchaku加持下,FLUX四重控制万物迁移秒出图,晋升生产力工具,开源界福音!收藏学习
  • 东莞英文网站制作/优化大师会员兑换码
  • 站长网站的优势/优化网站搜索
  • 下载的网站模板怎么修改/百度网盘搜索引擎入口在哪里
  • 温州建设工程网站/百度开户推广多少钱
  • 怎么看网站使用什么做的/站长工具爱站
  • 知名做网站的公司/郑州百度网站快速优化