class Solution:
def findTargetSumWays(self, nums: List[int], S: int) -> int:
if not nums:
return 0
#超时了
# count = 0
# def huisu(nums,index,res,S):
# nonlocal count
# if index==len(nums):
# if res==S:
# count+=1
# else:
# huisu(nums,index+1,res+nums[index],S)
# huisu(nums,index+1,res-nums[index],S)
# huisu(nums,0,0,S)
# return count
#背包问题dp[j] += dp[j - nums[i]]
#dp[j]代表填满背包dp[j]有dp[i]个方法
sumNums = sum(nums)
if (sumNums + S) % 2 == 1 or sumNums < S:
return 0
bagSize = (sumNums + S) // 2
dp = [0] * (bagSize+1)
dp[0] = 1
for i in range(len(nums)):
for j in range(bagSize, nums[i]-1, -1):
dp[j] += dp[j-nums[i]]
print(dp)
return dp[bagSize]
- 本题可用两种方法去解决
- 回溯:暴力枚举法
- 转化为背包问题
- 当前填满容量为j的包的方法数 = 之前填满容量为j的包的方法数 + 之前填满容量为j - num的包的方法数
- 也就是当前数num的加入,可以把之前和为j - num的方法数加入进来。