📜  leetcode 416 - Java (1)

📅  最后修改于: 2023-12-03 15:32:38.150000             🧑  作者: Mango

Leetcode 416 - Java

Leetcode 416是一个关于分割等和子集的问题,它要求我们给定一个非空正整数数组,判断该数组是否可以被划分成两个和相等的子集。

这个问题可以使用动态规划来解决,具体的做法是定义一个二维数组dp,其中dp[i][j]表示前i个元素中是否存在一些元素加起来等于j。首先,当j=0时,dp[i][0]为true;当i=0,j>0时,dp[0][j]为false。然后,在任意时刻,如果nums[i-1]>j,那么dp[i][j]=dp[i-1][j];否则,如果可以选择nums[i-1],那么dp[i][j]=dp[i-1][j] || dp[i-1][j-nums[i-1]]。最终,当dp[nums.length][sum]为true时,就说明可以将该数组分成两个和相等的子集。

下面是Java代码实现:

class Solution {
    public boolean canPartition(int[] nums) {
        int sum = 0;
        for (int num : nums) {
            sum += num;
        }
        if (sum % 2 != 0) { // 如果数组和为奇数,那么无法划分
            return false;
        }
        sum /= 2;
        boolean[][] dp = new boolean[nums.length+1][sum+1];
        dp[0][0] = true;
        for (int i = 1; i <= nums.length; i++) {
            dp[i][0] = true;
        }
        for (int j = 1; j <= sum; j++) {
            dp[0][j] = false;
        }
        for (int i = 1; i <= nums.length; i++) {
            for (int j = 1; j <= sum; j++) {
                if (nums[i-1] > j) {
                    dp[i][j] = dp[i-1][j];
                } else {
                    dp[i][j] = dp[i-1][j] || dp[i-1][j-nums[i-1]];
                }
            }
        }
        return dp[nums.length][sum];
    }
}

以上为Leetcode 416 - Java的介绍和相关代码,希望对你有所帮助。