力扣-416-分割等和子集
最好用dp做,dfs会超时
package LeetCode; /* * dp动态规划 * dp前先处理一下,对于下述两种情况直接判false * dp[i][j]表示下标在0..i之间的元素值之和是否等于j */ public class LeetCode416 { public static void main(String[] args) { int[] nums = {1,5,11,5}; boolean res = canPartition(nums); System.out.println(res); } public static boolean canPartition(int[] nums) { int sum = 0, maxNum = -1; for(int i = 0; i < nums.length; i++) { sum += nums[i]; maxNum = Math.max(maxNum, nums[i]); } if(sum % 2 == 1) return false; int target = sum/2; if(maxNum > target) return false; boolean[][] dp = new boolean[nums.length][target + 1]; //dp[i][j]表示下标在0..i之间的值之和是否等于j for(int i = 0; i < nums.length; i++) { dp[i][0] = true; } dp[0][nums[0]] = true; //其余的dp[0][:]都是false for(int i = 1; i < nums.length; i++) { for(int j = 0; j <= target; j++) { if(j >= nums[i]) { dp[i][j] = dp[i-1][j] | dp[i-1][j-nums[i]]; }else { dp[i][j] = dp[i-1][j]; } } } return dp[nums.length-1][target]; } }
作者:Ryanjie
出处:http://www.cnblogs.com/ryanjan/
本文版权归作者和博客园所有,欢迎转载。转载请在留言板处留言给我,且在文章标明原文链接,谢谢!
如果您觉得本篇博文对您有所收获,觉得我还算用心,请点击右下角的 [推荐],谢谢!