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

【LeetCode】【算法】416. 分割等和子集

LeetCode 416. 分割等和子集

题目描述

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

思路

和LeetCode 494.目标和很相似,这道题也是用动态数组可以求解的。

  1. nums的所有元素求个sum,若sum % 2 != 0,则return false; 因为此时没办法分成两个等和子集
  2. 定义dp数组dp[nums.length][bagSize +1],其中bagSize = sum / 2;
  3. 初始化dp数组:dp[0][nums[0]]=1;
  4. 填充dp数组:嵌套循环,有两种可能性:
    I. nums[i] > j时,dp[i][j]=dp[i-1][j]
    II. 否则,求最值dp[i][j]=Math.max(dp[i-1][j], dp[i-1][j-nums[i]]+nums[i])
  5. 返回:dp[nums.length-1][bagSize]==bagSize
  6. 为什么这里的递推式是求“最值”,我的理解是任何一个值都有可能是构成目标和的一部分

当然这可以用一维dp来解,因为nums[i]里面的数既是重量也是价值?但是我赶时间就没细看

代码

class Solution {
    public boolean canPartition(int[] nums) {
        int sum = 0;
        for (int num : nums) {
            sum += num;
        }
        if (sum % 2 != 0) return false; // 和无法评分,则无法分成两个相等的子集

        int bagSize = sum / 2; // 目标和的结果

        // 动态数组定义与初始化
        int[][] dp = new int[nums.length][bagSize + 1];
        if (nums[0] <= bagSize) dp[0][nums[0]] = 1;

        // 填充动态数组
        for (int i = 1; i < nums.length; i++) {
            for (int j = 1; j < bagSize + 1; j++) {
                if (nums[i] > j) dp[i][j] = dp[i - 1][j];
                else {
                    dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - nums[i]] + nums[i]);
                }
            }
        }

        return dp[nums.length - 1][bagSize] == bagSize;
    }
}

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

相关文章:

  • Python进阶之IO操作
  • 【bug日志-水】解决本地开发下代理和url同名导致刷新404的问题
  • QML项目实战:自定义Combox
  • [复健计划][紫书]Chapter 7 暴力求解法
  • 【GPT使用技巧】用AI出一门课
  • 一周内从0到1开发一款 AR眼镜 相机应用?
  • STM32F1 LL 库和HAL 库在GPIO 上的区别
  • 从0开始学习机器学习--Day13--神经网络如何处理复杂非线性函数
  • 【JavaEE】常见锁策略、CAS
  • python --03 (数据类型)
  • 【持续更新】【NLP项目】【自然语言处理】智能聊天机器人——“有问必答”【Chatbot】第2章、《模式一:问候模式》
  • Qt——窗口
  • 阿里云 DataWorks 正式支持 SelectDB Apache Doris 数据源,实现 MySQL 整库实时同步
  • Golang | Leetcode Golang题解之第542题01矩阵
  • Spring Boot 与 Vue 共筑航空机票预定卓越平台
  • Docker LLama-Factory vLLM 快速部署Meta-Llama-3.1-70B-Instruct
  • 银行卡二要素核验 API 对接说明
  • uniapp 实现瀑布流
  • LSTM+LightGBM+Catboost的stacking融合模型
  • Pr 视频过渡:沉浸式视频 - VR 默比乌斯缩放
  • 网络安全从入门到精通(特别篇II):应急响应之DDOS处置流程
  • ArcGIS地理空间平台 manager 任意文件读取漏洞复现
  • [C语言]strstr函数的使用和模拟实现
  • 《Java 实现堆排序:深入理解与代码剖析》
  • 如何选择适合的AWS EC2实例类型
  • VMWareTools安装及文件无法拖拽解决方案