动态规划
class Solution {
public:
int findTargetSumWays(vector<int>& nums, int target) {
int n = nums.size();
int sum = 0, num_max = 0;
for (int i = 0; i < n; i++) {
sum += nums[i];
num_max = max(num_max, abs(nums[i]));
}
int neg = (sum - target) / 2;
if (sum - target < 0 || (sum - target) % 2 == 1)
return 0;
vector<vector<int>> dp (n + 1, vector<int> (neg + 1, 0));
//for (int j = 0; j <= nums[0]; j++)
dp[0][0] = 1;
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= neg; j++) {
if (j >= nums[i - 1])
dp[i][j] = dp[i - 1][j] + dp[i - 1][j - nums[i - 1]];
else
dp[i][j] = dp[i - 1][j];
}
}
return dp[n][neg];
}
};
用一维数组优化空间
状态转移方程:
dp[j] += dp[j - nums[i]]
class Solution {
public:
int findTargetSumWays(vector<int>& nums, int target) {
int n = nums.size();
int sum = 0, num_max = 0;
for (int i = 0; i < n; i++) {
sum += nums[i];
}
int neg = (sum - target) / 2;
if (sum - target < 0 || (sum - target) % 2 == 1)
return 0;
vector<int> dp (neg + 1, 0);
dp[0] = 1;
for (int i = 0; i < n; i++) {
for (int j = neg; j >= nums[i]; j--) {
dp[j] += dp[j - nums[i]];
}
}
return dp[neg];
}
};