Leetcode Day11背包问题

背包问题Leetcode Day11背包问题_第1张图片

模版

@cache
def dfs(i, c):  # i指我们考虑几个物品, c指当前容量
	# 没有物品可以考虑了, 直接返回0
	if i < 0:
		return 0
	if weight[i] > c:
		return dfs(i-1, c)
	else:
		return max(dfs(i-1,c), dfs(i-1, c - weight[i]) + value[i]
		

494

给你一个非负整数数组 nums 和一个整数 target 。

向数组中的每个整数前添加 ‘+’ 或 ‘-’ ,然后串联起所有整数,可以构造一个 表达式 :

例如,nums = [2, 1] ,可以在 2 之前添加 ‘+’ ,在 1 之前添加 ‘-’ ,然后串联起来得到表达式 “+2-1” 。
返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。

示例 1:

输入:nums = [1,1,1,1,1], target = 3
输出:5
解释:一共有 5 种方法让最终目标和为 3 。
-1 + 1 + 1 + 1 + 1 = 3
+1 - 1 + 1 + 1 + 1 = 3
+1 + 1 - 1 + 1 + 1 = 3
+1 + 1 + 1 - 1 + 1 = 3
+1 + 1 + 1 + 1 - 1 = 3

回溯法很不幸超时了

class Solution:
    def findTargetSumWays(self, nums: List[int], target: int) -> int:
        s = sum(nums)
        target += s
        if target < 0 or target % 2 == 1:
            return 0
        
        @cache
        def dfs(i, c):
            if i < 0:
                return 1 if c == 0 else 0 
            if nums[i] > c:
                return dfs(i-1, c)
            return dfs(i-1, c) + dfs(i-1, c - nums[i])

        return dfs(len(nums) - 1, target // 2)

注意边界情况变了
if i < 0: return 1 if c == 0 else 0

零钱兑换

class Solution:
    def coinChange(self, coins: List[int], amount: int) -> int:

        @cache
        def dfs(i, c):
            if i < 0:
                return 0 if c == 0 else inf
            if coins[i] > c:
                return dfs(i - 1, c)
            return min(dfs(i - 1, c), dfs(i, c - coins[i]) + 1)
        res = dfs(len(coins) - 1, amount)
        return res if res != inf else -1

你可能感兴趣的:(leetcode,leetcode,算法,职场和发展)