

class Solution {
public:
bool canPartition(vector<int>& nums) {
int n = nums.size();
if(n<=1) // 数组长度小于等于1返回false
return false;
int sum = 0;
for(int i = 0; i < n; i++)
sum = sum + nums[i];
int res = sum%2;
if(res==1) // 奇数返回false
return false;
int target = sum/2;
sort(nums.begin(), nums.end());
if(nums[n-1]>target) // 最大值大于数组和的一半,返回false
return false;
vector<vector<bool>> dp(n, vector<bool> (target+1, false));
//长度为target+1,和才能为target
//dp[i][j] 表示从数组的 [0,i] 下标范围内选取若干个正整数(可以是 0 个)
//是否存在一种选取方案使得被选取的正整数的和等于 j
for(int i = 0; i < n; i++)
dp[i][0] = true; // 从0~i下标范围内选择若干个元素使得其和为0 肯定可以,不选嘛
dp[0][nums[0]] = true; // 从下标0选择元素使其和为nums[0] 肯定可以,就选nums[0];
for(int i = 1; i < n; i++){
for(int j = 1; j <= target; j++){
if(j>=nums[i]){
dp[i][j] = dp[i-1][j]||dp[i-1][j-nums[i]];
}
else{
dp[i][j] = dp[i-1][j];
}
}
}
return dp[n-1][target];
}
};