494. 目标和
给你一个非负整数数组 nums
和一个整数 target
。
向数组中的每个整数前添加 '+'
或 '-'
,然后串联起所有整数,可以构造一个 表达式 :
- 例如,
nums = [2, 1]
,可以在 2
之前添加 '+'
,在 1
之前添加 '-'
,然后串联起来得到表达式 "+2-1"
。
返回可以通过上述方法构造的、运算结果等于 target
的不同 表达式 的数目。
示例 1:
1 2 3 4 5 6 7 8
| 输入:nums = [1,1,1,1,1], target = 3 输出:5 解释:一共有 5 种方法让最终目标和为 3 。 -1 + 1 + 1 + 1 + 1 = 3 +1 - 1 + 1 + 1 + 1 = 3 +1 + 1 - 1 + 1 + 1 = 3 +1 + 1 + 1 - 1 + 1 = 3 +1 + 1 + 1 + 1 - 1 = 3
|
示例 2:
1 2
| 输入:nums = [1], target = 1 输出:1
|
提示:
1 <= nums.length <= 20
0 <= nums[i] <= 1000
0 <= sum(nums[i]) <= 1000
-1000 <= target <= 1000
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| class Solution { public int findTargetSumWays(int[] nums, int target) {
int n = nums.length, sum = Arrays.stream(nums).sum(); if ((target + sum) % 2 != 0) return 0; int tg = (target + sum) / 2; if (tg < 0) return 0; int dp[][] = new int[n+1][tg+1]; dp[0][0] = 1; for (int i = 0; i < n; i++) { for (int j = 0; j <= tg; j++) { if (j < nums[i]) { dp[i+1][j] = dp[i][j]; } else { dp[i+1][j] = dp[i][j] + dp[i][j-nums[i]]; } } } return dp[n][tg]; } }
|