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];
    }
};
posted @ 2026-03-26 14:08  rdcamelot  阅读(18)  评论(0)    收藏  举报