题目链接:https://leetcode.com/problems/partition-equal-subset-sum/
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.
Note:
Both the array size and each of the array element will not exceed 100.
Example 1:
Input: [1, 5, 11, 5] Output: true Explanation: The array can be partitioned as [1, 5, 5] and [11].
Example 2:
Input: [1, 2, 3, 5] Output: false Explanation: The array cannot be partitioned into equal sum subsets
思路:一个背包的题目,背包容量为数组中元素和的一半+1,这样只要看是否有元素可以正好填满背包即可.但是每个元素只能用一次,所以在尝试放一个元素的时候还要避免他对尝试放其他位置时对自己的影响.所以在尝试放一个元素到背包的时候需要从容量最大的位置开始,如果(当前位置-当前元素大小)位置可以通过放置之前的元素达到,则当前位置也可以通过放置当前元素正好达到这个位置.状态转移方程为:dp[i] = dp[i] || dp[i - nums[k]];
public boolean canPartition(int[] nums) {
int sum =0;
for (int i = 0; i < nums.length; i++) {
sum+=nums[i];
}
if(sum%2==1) {
return false;
}
int needSum = sum/2;
boolean[] dp = new boolean[needSum+1];
Arrays.fill(dp, false);
dp[0] = true;
for(int num:nums) {
if(num>needSum) {
continue;
}
for(int i=needSum;i>=num;i--) {
dp[i] = dp[i]||dp[i-num];
}
}
return dp[needSum];
}