动态规划算法-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];
    }
}
相关推荐
少年执笔6 小时前
android新版TTS无法进行语音播报
android·java
AndrewHZ6 小时前
【图像处理基石】如何高质量地生成一张庆祝元旦的图片?
图像处理·人工智能·opencv·算法·计算机视觉·生成式模型·genai
光明西道45号6 小时前
Leetcode 15. 三数之和
数据结构·算法·leetcode
咸鱼2.06 小时前
【java入门到放弃】数据结构
java·开发语言·数据结构
啊西:6 小时前
SuperMap iObjects Java地图生成栅格瓦片并保存到mongodb
java·开发语言·mongodb
教练、我想打篮球6 小时前
125 如何运行时实时切换数据库(实时切换影子库)
java·spring·shadow·datasource
毕设源码-赖学姐6 小时前
【开题答辩全过程】以 “实惠”药房管理系统为例,包含答辩的问题和答案
java
共享家95276 小时前
测试常用函数(一)
java·前端·javascript
廋到被风吹走6 小时前
【JAVA】【JDK】java8版本之后各个版本调整
java·开发语言
还不秃顶的计科生6 小时前
LeetCode 热题 100第一题:两数之和python版本
python·算法·leetcode