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.
思路:题目要求是否有子列使得子列的和为sum / 2。定义result[i][j],表示取i个数,在i个数的和不大于j的情况下所能取到的和的最大值。对应于本题,就是从n个数中取数,其和在保证不大于sum / 2的情况下的最大和。若此和等于sum/2,则返回true。本题思想类似于背包问题。
class Solution {
public:
bool canPartition(vector<int>& nums) {
int sum = 0;
for (int i = 0; i < nums.size(); i++) {
sum += nums[i];
}
if (sum % 2 != 0) {
return false;
}
int result[nums.size()][sum + 1];
for (int i = 0; i < nums.size(); i++) {
for (int j = 0; j <= sum; j++) {
result[i][j] = 0;
}
}
for (int i = 1; i < nums.size(); i++) {
for (int j = nums[i]; j <= sum; j++) {
result[i][j] = max(result[i - 1][j], result[i - 1][j - nums[i]] + nums[i]);
}
}
if (result[nums.size() - 1][sum / 2] == sum / 2) {
return true;
}
return false;
}
};