记忆化搜索
class Solution:
def lastStoneWeightII(self, stones: List[int]):
weight = sum(stones)
target = weight // 2
n = len(stones)
ans = 100
@cache
def dfs(i, s):
if i == n or s >= target:
nonlocal ans
ans = min(ans, abs(weight - 2 * s))
return
# 选 i
dfs(i + 1, s + stones[i])
# 不选 i
dfs(i + 1, s)
dfs(0, 0)
return ans
记忆化搜索
class Solution:
def findTargetSumWays(self, nums: List[int], target: int):
n = len(nums)
@cache
def dfs(i, s):
if i == n:
if s == target:
return 1
else:
return 0
return dfs(i + 1, s - nums[i]) + dfs(i + 1, s + nums[i])
return dfs(0, 0)
class Solution:
def findMaxForm(self, strs: List[str], m: int, n: int):
@cache
def dfs(i, s, x, y):
if x > m or y > n:
return 0
if i == len(strs):
return s
# 不选 i
val1 = dfs(i + 1, s, x, y)
# 选 i
add0 = strs[i].count('0') # 增加的0的数目
add1 = len(strs[i]) - add0 # 增加的1的数目
val2 = dfs(i + 1, s + 1, x + add0, y + add1)
return max(val1, val2)
return dfs(0, 0, 0, 0)