目标和-动态规划494-python

这篇博客详细解析了01背包问题的解决方案,通过动态规划算法实现寻找目标和的路径数。首先计算数值总和与目标值的差值,判断是否能形成目标和。然后采用一维滚动数组简化二维DP数组,从后向前遍历,更新dp数组。最后返回dp数组的最后一个元素作为结果。
摘要由CSDN通过智能技术生成

01背包问题,答案解析。

class Solution:
    def findTargetSumWays(self, nums: List[int], target: int) -> int:
        # 公式推导和变量意义见答案解析。
        diff = (sum(nums) - target)
        if diff < 0 or diff % 2 == 1:
            return 0
        neg = (sum(nums)-target) // 2
        '''
        因为可以每个数字都不取,所以dp数组有len(nums)+1行;
        初始化为dp[0][0] = 1,是对应neg==0时sum(nums)==target的情况,
        此时只有nums数组所有数字都对应加号着一种情况。
        '''
        dp = [[0] * (neg+1) for _ in range(len(nums)+1)]
        dp[0][0] = 1

        for i in range(1, len(nums)+1):
            for j in range(neg+1):
                if nums[i-1] > j:
                    dp[i][j] = dp[i-1][j]
                else:
                    dp[i][j] = dp[i-1][j] + dp[i-1][j-nums[i-1]]
        
        return dp[-1][-1]

01背包问题的二维dp数组,一般都可以替换成一维滚动数组,同样要注意背包遍历要倒序以防止重复添加物品

class Solution:
    def findTargetSumWays(self, nums: List[int], target: int) -> int:
        diff = (sum(nums) - target)
        if diff < 0 or diff % 2 == 1:
            return 0
        neg = (sum(nums)-target) // 2
        dp = [0] * (neg+1)
        dp[0] = 1

        for i in range(1, len(nums)+1):
            for j in range(neg, -1, -1):
                if nums[i-1] > j:
                    dp[j] = dp[j]
                else:
                    dp[j] = dp[j] + dp[j-nums[i-1]]
        
        return dp[-1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值