LeetCode HOT100 - 目标和
紧接着前一题零钱,这里能看出来也是 DP ,因为我们要求方案数
区别就在于这里的每个元素只能使用一次
先从结果出发,我们是要求 target 的方案数是多少
那么状态就是设计成 dp[i] 表示表达式是 i 的方案数是多少
接着枚举每个元素,因为是可加可减,所以 ndp[i] = dp[i - a[j]] + dp[i + a[j]]
小技巧是这里下标不能是负数,所以直接加上最大值来保证下标非负
class Solution {
public:
int findTargetSumWays(vector<int>& a, int target) {
int sum = accumulate(a.begin(), a.end(), 0);
if (sum < abs(target)) {
return 0;
}
vector<int> dp(2 * sum + 1, 0);
int n = a.size();
dp[sum] = 1;
for (int i = 0; i < n; i++) {
vector<int> ndp(2 * sum + 1, 0);
for (int j = -sum; j <= sum; j++) {
if (j - a[i] >= -sum) ndp[j + sum] += dp[sum + j - a[i]];
if (j + a[i] <= sum) ndp[j + sum] += dp[sum + j + a[i]];
}
dp = ndp;
}
return dp[target + sum];
}
};

浙公网安备 33010602011771号