← [ BACK_TO_NOTES ]

目标和

01 背包方案数经典题:把加减号问题转化成选数凑和的问题。

#algorithm #snippet #growing #leetcode #dp

[!info] related notes 动态规划 背包 DP

目标和

题目链接:https://leetcode.cn/problems/target-sum/

关键转化

设加号集合和为 P,减号集合和为 N。

则:

P - N = target
P + N = sum

两式相加得:

P = (sum + target) / 2

问题转成:

从数组中选一些数,使它们的和恰好等于 P,有多少种选法?

这是 01 背包方案数。

状态

dp[j] 表示凑出和 j 的方案数。

转移

dp[j] += dp[j - num]

JavaScript

var findTargetSumWays = function(nums, target) {
    const sum = nums.reduce((a, b) => a + b, 0);
    if (sum + target < 0 || (sum + target) % 2 !== 0) return 0;

    const bag = (sum + target) / 2;
    const dp = new Array(bag + 1).fill(0);
    dp[0] = 1;

    for (const num of nums) {
        for (let j = bag; j >= num; j--) {
            dp[j] += dp[j - num];
        }
    }

    return dp[bag];
};
创建于 2026/3/18 更新于 2026/7/15
Digital Biome
Access

键盘导航

j / k / ↑ / ↓
选择对象
Enter / o
打开选择
/ 或 Ctrl+K
全站搜索
i / f / 1–4
筛选当前列表
g → h / l / p / t / a
首页 / 笔记 / 项目 / 工具 / About
r → 1–9
打开所选对象的关联
u
返回上一页
Esc
关闭浮层 / 取消命令;输入框内清空文本