📅  最后修改于: 2023-12-03 15:32:38.150000             🧑  作者: Mango
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的介绍和相关代码,希望对你有所帮助。