416. 分割等和子集
原题链接:
https://leetcode.cn/problems/partition-equal-subset-sum/description/
完成情况:

解题思路:
该代码是一个解决问题的类,其中包含一个名为canPartition的方法,该方法接受一个整数数组nums作为参数,并返回一个布尔值。
在方法中,首先获取数组的长度n,如果n小于2,则直接返回false。然后计算数组中所有元素的和sum和最大值maxNum。
接着判断sum是否为偶数,如果不是则返回false。计算出目标值target为sum的一半,并判断最大值maxNum是否大于目标值,如果是则返回false。
创建一个二维数组dp,用于动态规划。初始化dp数组的第一列为true,表示可以通过选择前i个元素得到和为0。然后初始化dp数组的第一行,表示只选择第一个元素可以得到对应的和。
接着进行动态规划的计算,遍历数组元素和目标值,根据当前元素是否选择来更新dp数组。最终返回dp数组的最后一个元素是否为true。
这段代码的作用是判断给定数组是否可以分割成两个和相等的子集,如果可以则返回true,否则返回false。
参考代码:
_416分割等和子集
java
package leetcode板块;
import java.util.Arrays;
public class _416分割等和子集 {
/**
*
* @param nums
* @return
*/
public boolean canPartition(int[] nums) {
//给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
//1.首先得是倍数 ,,2.排序,,,然后从左从右开始找
//先去掉一些不可能满足条件的情况
//数组初始化排序一下
Arrays.sort(nums);
int n = nums.length;
if (n < 2){
return false;
}
int sum = 0,maxNum = 0;
for (int num : nums){
sum += num;
maxNum = Math.max(maxNum,num);
}
if (sum % 2 != 0) return false;
int target = sum /2;
if (maxNum > target){
return false;
}
//-------------排除掉一些不满足条件的情况---------------
boolean [][] dp_canPartition = new boolean[n][target + 1];
for (int i = 0;i < n;i++){
dp_canPartition[i][0] = true;
}
dp_canPartition[0][nums[0]] = true;
for (int i = 1; i < n;i++){
int num = nums[i];
for (int j = 1;j <= target;j++){
if (j >= num){
dp_canPartition[i][j] = dp_canPartition[i-1][j] | dp_canPartition[i-1][j - num];
}else {
dp_canPartition[i][j] = dp_canPartition[i-1][j];
}
}
}
return dp_canPartition[n-1][target];
}
}