
问题分析:此问题为什么可以利用01背包求解?我们假设nums[] 所有元素的总和为sum,那么我们把问题转化为,给定一系列物品,其中每样物品的价值和重量相等,即为nums[i],且背包容量为 sum / 2,求当前背包容量下的最大价值。
解法一(最朴素)
class Solution {public boolean canPartition(int[] nums) {int sum = 0;for(int num : nums){sum += num;}if(sum % 2 != 0){return false;}int n = nums.length;int[][] dp = new int[n + 1][sum / 2 + 1];for(int i = 1; i <= n; i++){int val = nums[i - 1];for(int j = 0; j <= sum / 2; j++){int a = dp[i - 1][j];int b = j - val >= 0 ? dp[i -1][j - val] + val : 0;dp[i][j] = Math.max(a, b);}}return dp[n][sum / 2] == sum / 2;}}
解法二(一维解法)
class Solution {public boolean canPartition(int[] nums) {int sum = 0;for(int num : nums){sum += num;}if(sum % 2 != 0){return false;}int n = nums.length;int[] dp = new int[sum / 2 + 1];for(int i = 1; i <= n; i++){int val = nums[i - 1];for(int j = sum / 2; j >= val; j--){dp[j] = Math.max(dp[j], dp[j -val] + val);}}return dp[sum / 2] == sum / 2;}
