class Solution:
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
result=[]
def solve(candidates,target,start, temp ):
if target ==0:
result.append(temp.copy())
return
if target <0:
return
for i in range(start ,len(candidates)):
if target-candidates[i]>=0:
temp.append(candidates[i])
solve(candidates,target-candidates[i],i,temp)
temp.pop()
solve(candidates,target,0,[])
return result
#迭代
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
# dp[i] 将存储所有和为 i 的组合列表
# 初始化 dp 列表,每个元素是一个空列表
# 大小为 target + 1 (从 0 到 target)
dp = [[] for _ in range(target + 1)]
# base case: 和为 0 的组合只有一种,即空列表 []
# 为了方便后续计算,我们将 dp[0] 初始化为包含一个空列表的列表 [[]]
dp[0] = [[]]
# 遍历每一个候选数字
for candidate in candidates:
# 遍历从 candidate 到 target 的所有可能的和 i
# (因为小于 candidate 的和 i 不可能通过加上当前的 candidate 得到)
for i in range(candidate, target + 1):
# 对于每个 i,检查 dp[i - candidate]
# dp[i - candidate] 包含了所有和为 i - candidate 的组合
for prev_combination in dp[i - candidate]:
# 对于每一个和为 i - candidate 的组合 prev_combination,
# 将当前的 candidate 添加进去,就得到了一个和为 i 的新组合
# 注意:要创建新列表,避免修改之前的组合
dp[i].append(prev_combination + [candidate])
# 最终结果是 dp[target],它包含了所有和为 target 的组合
return dp[target]