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

【leetcode hot 100 416】分割等和子集

解法一:(动态规划)①定义:dp[i]表示是否可以在nums找到元素之和为i,dp[sum/2+1] ②初始状态:dp[0]=true;dp[i]=false ③状态转移方程:dp[i] = dp[i] || dp[i - num];

class Solution {
    public boolean canPartition(int[] nums) {
        // 定义:dp[i]表示是否可以在nums找到元素之和为i,dp[sum/2+1]
        // 初始状态:dp[0]=true;dp[i]=false
        // 状态转移方程:dp[i] = dp[i] || dp[i - num];
        int n = nums.length;

        // 先计算总和
        int sum = 0;
        for (int num : nums) {
            sum += num;
        }
        // 计算每个子集的和应该为多少
        int target = sum / 2;

        // 预先判断
        // 如果和不能被2整除,则不能分为两个子集
        if (sum % 2 != 0) {
            return false;
        }
        // 由于nums只包含正整数,若任意一个数大于target则不能满足
        for (int num : nums) {
            if (num > target){
                return false;
            }
        }

        // 动态规划
        boolean[] dp = new boolean[target+1]; // dp[i]=true表示能在数组nums中找到子集和为i
        dp[0] = true;
        for (int num : nums) {
            
            // 不需要,后面for循环:
            // 当i=num时,dp[num]=dp[num]||dp[num-num]=dp[num]||dp[0]=false||true=true
            // 而且会错误
            // 没有避免一个数被多次取和没有取!!!!
            // dp[num] = true;  // 给每个dp[num]赋值,num一定存在

            // 循环num,尝试把num加进去,确保每个dp[i]只会用到一个num
            // 第二层的循环我们需要从大到小计算,因为如果我们从小到大更新 dp 值,那么在计算 dp[j] 值的时候,dp[j−nums[i]] 已经是被更新过的状态,不再是上一行的 dp 值。
            for (int i=target; i >= num; i--) {
                dp[i] = dp[i] || dp[i - num];
            }
            if(dp[target]){
                // 已经有子集了,提前结束
                return true;
            }
        }
        return dp[target];
    }
}

注意:

  • 循环num,尝试把num加进去,确保每个dp[i]只会用到一个num
  • 第二层的循环我们需要从大到小计算,因为如果我们从小到大更新 dp 值,那么在计算 dp[j] 值的时候,dp[j−nums[i]] 已经是被更新过的状态,不再是上一行的 dp 值。
  • num一定存在,不需要dp[num] = true; 给每个dp[num]赋值。后面for循环:当i=num时,dp[num]=dp[num]||dp[num-num]=dp[num]||dp[0]=false||true=true;而且会错误,没有避免一个数被多次取和没有取!!!!错误:
    在这里插入图片描述

相关文章:

  • MCU刷写——Hex文件格式详解及Python代码
  • AI识别与雾炮联动:工地尘雾治理新途径
  • Win32++ 使用初探
  • 程序化广告行业(79/89):技术革新与行业发展脉络梳理
  • 公开赛Web-ssrfme
  • 【异常处理】Clion IDE中cmake时头文件找不到 头文件飘红
  • 解决2080Ti使用节点ComfyUI-PuLID-Flux-Enhanced中遇到的问题
  • lvs+keepalived+dns高可用
  • 使用nuxt3+tailwindcss4+@nuxt/content3在页面渲染 markdown 文档
  • 红宝书第四十讲:React 核心概念:组件化 虚拟 DOM 简单教程
  • forms+windows添加激活水印
  • 塔能科技解节能密码,工厂成本“效益方程式”精准破题
  • AF3 ProteinDataset类的_process方法解读
  • 操作系统之进程同步
  • python的flask框架连接数据库
  • 区块链从专家到小白
  • GAS:车载体验的智能革新力量
  • Rag实现流程
  • 软件界面设计:打造用户喜爱的交互体验
  • 新版雷电模拟器过应用检测技术详解
  • 电子商务网站建设与维护李建忠下载/产品推广哪个平台好
  • wordpress金币插件/手机系统优化软件哪个好
  • 做学习交流网站/腾讯云域名注册官网
  • 网站建设教学视频百度云盘/优化师助理
  • 郴州住房和城乡建设委员会网站/微信公众号的推广
  • 做网站收费/五合一网站建设