LeetCode#416-分割等和子集
package dp;
/*
416. 分割等和子集
给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
注意:
每个数组中的元素不会超过 100
数组的大小不会超过 200
示例 1:
输入: [1, 5, 11, 5]
输出: true
解释: 数组可以分割成 [1, 5, 5] 和 [11].
示例 2:
输入: [1, 2, 3, 5]
输出: false
解释: 数组不能分割成两个元素和相等的子集.
*/
public class p416 {
public static boolean canPartition(int[] nums) {
if(nums.length<2||nums==null)return false;
int Sum=0,target;
for(int i:nums ){
Sum+=i;
}
if(Sum%2!=0)return false;
target=Sum/2;
boolean dp[][]=new boolean[nums.length][target+1];
dp[0][0]=true;
if(nums[0]<=target){
dp[0][nums[0]]=true;
}
for(int i=1;i<nums.length;i++){
for(int j=0;j<=target;j++){
dp[i][j]=dp[i-1][j];
if (nums[i] == j) {
dp[i][j] = true;
continue;
}
if(j>nums[i]){
dp[i][j]=dp[i-1][j]||dp[i-1][j-nums[i]];
}
}
if(dp[i][target])return true;
}
return dp[nums.length-1][target];
}
public static void main(String[] args) {
int nums[]={1,5,11,5};
System.out.println(canPartition(nums));
}
}
运行结果:


浙公网安备 33010602011771号