[leetcode]416-Partition Equal Subset Sum
链接:https://leetcode.com/problems/partition-equal-subset-sum/description/
Question
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:
- Each of the array element will not exceed 100.
- The array size will not exceed 200.
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.
Solution
class Solution {
public:
bool canPartition(vector<int>& nums) {
int sum = 0;
int size = nums.size();
for (int i = 0; i < size; i++)
sum += nums[i];
if (sum % 2 == 1) return false;
vector<vector<bool> > dp;
dp.resize(size+1);
for (int i = 0; i <= size; i++) dp[i].resize(sum, false);
dp[0][0] = true;
for (int i = 1; i <= size; i++) {
for (int j = 0; j <= sum; j++) {
if (j >= nums[i-1]) dp[i][j] = dp[i-1][j-nums[i-1]] || dp[i-1][j];
else dp[i][j] = dp[i-1][j];
if (j == sum/2 && dp[i][j] == true)
return true;
}
}
return false;
}
};
思路:dp[i][j]表示是否可能前i个数中的总和为j,为true就是有可能,为false就是没有可能。状态转移很简单,每次要不选择nums[j],要不干脆不选,看看有没有可能。如果在中间直接有机会等于sum/2就说明成功了。