0.总结

  • 本题难点在于抽象的能力,如何将本题抽象成一道动态规划题是关键。

1.​​题目​​

2.思想

2.1 深搜 + 剪枝

  • (1)每个整数前只能加一个符号,每次都有两种选择
  • (2)将得到的数字求和,判断是否可以得到想要的结果target
  • (3)根据条件判断当前这个节点是否值得深搜

可惜的是,这个python下的代码过不完测试样例。

2.2 动态规划

初看题解,本题竟然还可以使用动态规划?!我是大大的震惊!但是这些题目考的就是抽象的分析能力,难点在于如何将本道题转换成一个动态规划需要解决的题?于是有了下面这段分析。

3.代码

3.1 深搜+剪枝

下面这个代码的ac情况如下:
【LeetCode】494. 目标和_算法

class Solution:
def __init__(self):
self.res = 0
def findTargetSumWays(self, nums: List[int], target: int) -> int:
post_sum = [0] * (len(nums)+1) # 记录后n项和
for i in reversed(range(len(nums))):
post_sum[i] = post_sum[i+1] + nums[i]
# print(post_sum)
# 当前正在访问第idx个元素
self.dfs(target,nums,idx=0,tmp=[],post_sum=post_sum)
return self.res

# idx 表示当前正在访问的下标数字
def dfs(self,target,nums,idx,tmp,post_sum):
# 剪枝
# 如果当前的和减去
if sum(tmp) - post_sum[idx] > target:
return
if sum(tmp) + post_sum[idx] < target:
return

if idx==len(nums) :
# print(tmp)
if sum(tmp) == target:
self.res += 1
return

# 修改为+
tmp.append(nums[idx])
self.dfs(target,nums,idx+1,tmp,post_sum)
tmp.pop()

# 修改为-
tmp.append(-nums[idx])
self.dfs(target,nums,idx+1,tmp,post_sum)
tmp.pop()

'''
[16,40,9,17,49,32,30,10,38,36,31,22,3,36,32,2,26,17,30,47]
49
'''

3.2 动态规划

~