【动态规划之背包问题】子集背包--目标和

494. 目标和 - 力扣(LeetCode) (leetcode-cn.com)https://leetcode-cn.com/problems/target-sum/

1.DFS--暴力搜索O(n^2)

class Solution:
    def findTargetSumWays(self, nums: List[int], target: int) -> int:
        def dfs(nums,ans,i,target):
            if i==len(nums):
                return 1 if ans==target else 0
            left=dfs(nums,ans+nums[i],i+1,target)
            right=dfs(nums,ans-nums[i],i+1,target)
            return left+right
        res=dfs(nums,0,0,target)
        return res

2.动态规划--O(n*neg)

Step1. 转换为背包问题:

背包容量可以为neg也可以为pos,但要注意,凑pos和凑neg的判断条件有区别,目标是一致的,就是存在正部和副部,

所以当要凑neg时,合法条件是diff=sums-target>0

当要凑pos时,合法条件是diff=sums+target>0

Step2.异常情况判定:neg为非负 整数

sums-target>0=0 and (sums-target)%2==0

Step3. j开始的位置:0

需要注意的是,j的更新范围是【0,bag+1)

注意0, 因为这个数组可能要凑0

class Solution(object):
    def findTargetSumWays(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        sums=sum(nums)
        if target>sums or (sums-target)%2==1:
            return 0
        bag=int((sums-target)/2)
        dp=[[0]*(bag+1) for _ in range(len(nums)+1)]
        for i in range(len(nums)+1):
            dp[i][0]=1
        for i in range(1,len(nums)+1):
            for j in range(bag+1):
                if j>=nums[i-1]:
                    dp[i][j]=dp[i-1][j]+dp[i-1][j-nums[i-1]]
                else:
                    dp[i][j]=dp[i-1][j]
        return dp[-1][-1]

时间复杂度:O(n*neg)

空间复杂度:O(n*neg)但可降低道O(neg)

背包问题合集力扣

力扣

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值