416. 分割等和子集

image.png

二维数组

  1. class Solution {
  2. public boolean canPartition(int[] nums) {
  3. int size = nums.length;
  4. int sum = 0;
  5. for(int i : nums) {
  6. sum += i;
  7. }
  8. if( (sum & 1 ) != 0) return false;
  9. int target = sum >> 1;
  10. int[][] dp = new int[size][target + 1];
  11. for(int j = nums[0]; j <= target; j++ ) {
  12. dp[0][j] = nums[0];
  13. }
  14. for(int i = 1; i < size; i++ ) {
  15. for(int j = 0; j <= target; j++) {
  16. if(j < nums[i] ) {
  17. dp[i][j] = dp[i - 1][j];
  18. } else {
  19. dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - nums[i]] + nums[i]);
  20. }
  21. }
  22. }
  23. return dp[size - 1][target] == target;
  24. }
  25. }

滚动数组

  1. class Solution {
  2. public boolean canPartition(int[] nums) {
  3. int size = nums.length;
  4. int sum = 0;
  5. for(int i : nums ) {
  6. sum += i;
  7. }
  8. if( (sum & 1) != 0) return false;
  9. sum /= 2;
  10. int dp[] = new int[sum + 1];
  11. for(int i = 0; i < size; i++ ) {
  12. for(int j = sum; j >= nums[i]; j-- ) {
  13. dp[j] = Math.max(dp[j],dp[j - nums[i] ] + nums[i] );
  14. }
  15. }
  16. return dp[sum] == sum;
  17. }
  18. }