动态规划算法-01背包问题:50.分割等和子集

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

算法原理:

解法:动态规划

Java代码:

java 复制代码
/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 王洋
 * Date: 2025-10-27
 * Time: 23:58
 */
class Solution {
    //416. 分割等和子集
    //自己看着算法原理笔记写的,跟吴小哲写的一模一样,就是没注意nums的下标关系而已
    //这是优化前的代码
    public boolean canPartition(int[] nums) {
        int sum=0;
        for(int x:nums) sum+=x;
        if(sum%2==1) return false;
        int n=nums.length;
        boolean[][] dp=new boolean[n+1][(sum/2)+1];
        //初始化
        for(int i=0;i<=n;i++) dp[i][0]=true;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=sum/2;j++){
                dp[i][j]=dp[i-1][j];
                //用nums的时候注意下标映射关系
                if(j>=nums[i-1]) dp[i][j]=dp[i][j]||dp[i-1][j-nums[i-1]];
            }
        return dp[n][sum/2];
    }
    public boolean canPartition2(int[] nums) {
        int sum=0;
        for(int x:nums) sum+=x;
        if(sum%2==1) return false;
        int n=nums.length;
        boolean[] dp=new boolean[(sum/2)+1];
        //初始化
        // for(int i=0;i<=n;i++) dp[i][0]=true;
        dp[0]=true;
        for(int i=1;i<=n;i++)
            //如果想把这个循环下的if去掉就直接改成j>=nums[i-1]
            for(int j=sum/2;j>=1;j--){
                // dp[i][j]=dp[i-1][j];
                //用nums的时候注意下标映射关系
                if(j>=nums[i-1]) dp[j]=dp[j]||dp[j-nums[i-1]];
            }
        return dp[sum/2];
    }
}
相关推荐
代码羊羊27 分钟前
Rust 迭代器完全通俗易懂指南(零基础全覆盖)
java·开发语言·rust
Zevalin爱灰灰5 小时前
现代密码学 第二章——流密码【下】
算法·密码学
MY_TEUCK8 小时前
【Java 后端】SpringBoot 登录认证与会话跟踪实战(JWT + Filter/Interceptor)
java·开发语言·spring boot
飞Link8 小时前
大模型长文本的“救命稻草”:深度解析 TurboQuant 与 KV Cache 压缩技术
算法
今天长肉了吗8 小时前
银行风控项目踩坑实录:指标跑了6小时,风险评分全挂了
java
随读手机8 小时前
多式联运信息交互平台完整方案(2026版)
java·ai·eclipse·云计算·区块链
郝学胜-神的一滴8 小时前
深度学习优化核心:梯度下降与网络训练全解析
数据结构·人工智能·python·深度学习·算法·机器学习
Je1lyfish9 小时前
CMU15-445 (2025 Fall/2026 Spring) Project#3 - QueryExecution
linux·c语言·开发语言·数据结构·数据库·c++·算法
许彰午9 小时前
03-二叉树——从递归遍历到非递归实现
java·算法
nj01289 小时前
Spring 循环依赖详解:三级缓存、早期引用、AOP 代理与懒加载
java·spring·缓存