(1)dp,背包问题
class Solution {
public:
bool canPartition(vector<int>& nums) {
int n = nums.size();
if (n < 2) {
return false;
}
int sum = accumulate(nums.begin(), nums.end(), 0);
int maxNum = *max_element(nums.begin(), nums.end());
if (sum & 1) {
return false;
}
int target = sum / 2;
if (maxNum > target) {
return false;
}
vector<vector<int>> dp(target+1, vector<int>(n, 0));
for (int i = 0; i < n; i++) {
dp[0][i] = true;
}
dp[nums[0]][0] = true;
for (int i = 1; i <= target; i++) {
for (int j = 1; j < n; j++) {
if (i >= nums[j]) {
dp[i][j] = dp[i][j-1] || dp[i-nums[j]][j-1];
} else {
dp[i][j] = dp[i][j-1];
}
}
}
return dp[target][n-1];
}
};