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)); } }
运行结果: