分割等和子集
分析
其实就是一个背包问题,但是这个背包问题不是求最值,而是求解是都可达。
class Solution {
public:
bool canPartition(vector<int>& nums) {
int dp[200 * 100 + 100];
memset(dp, 0, sizeof(dp));
dp[0] = 1;
int sum = 0;
for (int c : nums)sum += c;
if (sum & 1)return false;
sum /= 2;
for (int i = 0; i < nums.size(); i++) {
for (int j = sum; j >= nums[i]; j--) {
dp[j] = (dp[j] | dp[j - nums[i]]);
}
}
return dp[sum] == 1;
}
};