You are given an integer array nums
and an integer target
.
You want to build an expression out of nums by adding one of the symbols '+'
and '-'
before each integer in nums and then concatenate all the integers.
- For example, if
nums = [2, 1]
, you can add a'+'
before2
and a'-'
before1
and concatenate them to build the expression"+2-1"
.
Return the number of different expressions that you can build, which evaluates to target
.
可以转变成0-1背包问题
+1:sum_x
-1:sum_y
sum_x + sum_y = sum(nums)
sum_x - sum_y = target
sum_x = (sum(nums) + target) // 2
如何在数组中找到一个集合,使集合中元素和为(target+sum)/2。这就变为了「0-1 背包问题」中求装满背包的方案数问题。
class Solution:
def findTargetSumWays(self, nums: List[int], target: int) -> int:
sum_nums = sum(nums)
if abs(target) > abs(sum_nums) or (target + sum_nums) % 2 == 1:
return 0
size = (target + sum_nums) // 2
dp = [0 for _ in range(size + 1)]
dp[0] = 1
for i in range(1, len(nums)+1):
for w in range(size, nums[i-1] - 1, -1):
dp[w] += dp[w - nums[i-1]]
return dp[size]