本文主要是介绍89、动态规划-分割等和子集,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
思路:
首先 数组和为奇数 肯定不行。然后穷举从0开始到N中要和不要组成数组,如果组成数组等于整体数组和的一半,那么就可以,返回true。代码如下:
public static boolean canPartition02(int[] nums) {if (nums==null||nums.length==0){return false;}int sum=nums[0];for (int i = 1; i <nums.length; i++) {sum+=nums[i];}if (sum%2!=0){return false;}return process(nums,0,sum/2);}private static boolean process(int[] nums, int index, int rest) {if (index==nums.length){return rest==0;}//当前index 要boolean p1=process(nums,index+1,rest-nums[index]);//当前index 不要boolean p2=process(nums,index+1,rest);return p1||p2;}
改成动态规划如下:
public static boolean canPartition(int[] nums) {if (nums == null || nums.length == 0) {return false;}int sum = 0;for (int num : nums) {sum += num;}if (sum % 2 != 0) {return false;}int target = sum / 2;boolean[][] dp = new boolean[nums.length + 1][target + 1];dp[0][0] = true; // 不选取任何元素时,总和为0是可达的for (int i = 1; i <= nums.length; i++) {for (int j = 0; j <= target; j++) {dp[i][j] = dp[i - 1][j]; // 不选取当前元素if (j >= nums[i - 1]) {dp[i][j] = dp[i][j] || dp[i - 1][j - nums[i - 1]]; // 选取当前元素}}}return dp[nums.length][target];
}
这篇关于89、动态规划-分割等和子集的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!