动态规划算法-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];
    }
}
相关推荐
silvamux_3 分钟前
4款新模型商务邮件翻译横评:0.98到0.46
android·java·javascript
佳木逢钺12 分钟前
从火灾模拟到系统热寂:一个双非运维如何用零 GPU 推导出多智能体系统的终极死锁
人工智能·python·算法·多智能体
垆边人似月.16 分钟前
网格最小代价路径,总代价不超过 budget
算法
虚无的纽扣17 分钟前
【力扣刷题】第五天:将 x 减到 0 的最小操作数、最大连续1的个数 III
算法·leetcode·职场和发展
C++ 老炮儿的技术栈21 分钟前
char 造成的数据溢出
linux·服务器·c语言·c++·算法·c
Dovis(誓平步青云)25 分钟前
车辆进入隧道后信号断开,座舱旅程怎样补回事件
java·开发语言·前端·数据库·电脑
砚底藏山河26 分钟前
数据新鲜度 SLA 监控
java·大数据·python·maven
sqc233sqc36 分钟前
第 J8 周:ResNeXt-50 算法解析
人工智能·算法
杨杨杨大侠9 小时前
都能接模型、RAG 和 MCP,Java Agent 框架到底差在哪?
java
Thinker QAQ10 小时前
并发编程(九):BlockingQueue 与 Channel——语言层的原子性、可见性与有序性
java·python·go·并发编程·channel·blockingqueue·message passing