Description:
Given a non-empty
array containing only positive integers
, find if the array can be partitioned into two
subsets such that the sum of elements in both subsets is equal.
注意事项
Each of the array element will not exceed 100.
The array size will not exceed 200.
Explanation:
Given nums = [1, 5, 11, 5]
, return true
two subsets: [1, 5, 5], [11]
Given nums = [1, 2, 3, 9]
, return false
Solution:
First, calculate the sum of nuts. If the result is odd, return false. If not, set the target as half of the sum.Then we can transform the problem to backpack.
Regard mums[i] as element, target as the capacity of the backpack.
public class Solution {
/**
* @param nums a non-empty array only positive integers
* @return return true if can partition or false
*/
public boolean canPartition(int[] nums) {
// Write your code here
int sum = 0;
int len = nums.length;
for(int i = 0 ; i < len ; i++){
sum += nums[i];
}
if(sum%2 == 1) return false;
int target = sum/2;
int[][] dp = new int[len][target + 1];
for(int i = nums[0];i<=target;i++){
dp[0][i] = nums[0];
}
for(int i = 1;i<len;i++){
for(int j = nums[i];j<=target;j++){
dp[i][j] = Math.max(dp[i-1][j] , dp[i - 1][j - nums[i]] + nums[i]);
}
}
if(dp[len - 1][target] == target) return true;
return false;
}
}