状态:
- 前x个数
- 累加和y
- 值: 前x 个数是否可以凑出 累加和为y <\bool>
bool canPartition(vector<int> nums) {
int sum =0;
int n = nums.size();
for(int item : nums) sum += item;
if(sum % 2 == 1) return false;
int target = sum / 2;
/*
dp:
- x: 前 s 个 数
- y: 和 i
- v: bool 是否能够 使用前 s 个 数达到 i
*/
vector<vector<bool>> dp(target + 1, vector<bool>(n + 1, false));
// bad case [0][] 和为0 的数都为true
for(int x = 0;x <= n; ++x){
dp[0][x] = true;
}
for(int y = 1; y <= target; ++y) {
for(int x = 1; x<= nums.size(); ++x) {
if(y < nums[x-1]) {
// 目标的和 小于当前值时,看前一个是否已经满足
dp[y][x] = dp[y][x-1];
} else {
// 目标的和 大于当前值,查看前 x - 1 个是否已经满足
// 加入这个数后,前 x - 1 是否是否有数的和为 y - nums[x-1]
dp[y][x] = dp[y][x-1] || dp[y-nums[x-1]][x-1];
}
}
}
return dp[target][n];
}