LeetCode 39. Combination Sum 题解(回溯 / DFS)

题目要求 :给定一个由互不相同的正整数构成的数组 candidates,以及一个目标值 target,找出所有可以使数字和为 target 的组合。

数组中的数字可以被重复选择任意次,但组合之间不能重复,返回结果的顺序可以任意。


题目分析

几个关键信息:

  • 数组元素互不相同 ,每个元素可以被重复使用多次
  • 需要返回的是「所有不重复的组合」,而不是个数;组合中元素的顺序不重要,例如 [2,2,3] 和 [2,3,2] 视为同一个组合。
  • 测试数据保证合法组合的数量不会超过 150,说明暴力枚举所有组合是可行的,只要剪枝得当。

这类「找所有组合、元素可以重复、顺序不重要」的问题,非常典型地适合用 DFS + 回溯(backtracking) 来做。


回溯思路与核心参数设计

回溯的本质是「枚举所有可能的选择路径」,在路径无效时回退,在路径满足条件时收集结果。

常见的参数设计如下:

  • start:当前这一层递归从哪个下标开始枚举,防止往前"倒退"从而产生重复组合。
  • path:当前已经选出的这一条组合路径。
  • curr_sum 或 remain:当前已选数字的和,或者剩余还需要凑出的值。

典型逻辑可以写成伪代码(思想层面):

复制代码
如果 remain == 0:说明当前 path 的和恰好等于 target,把 path 拷贝加入结果。
如果 remain < 0:说明已经超过 target,直接返回,剪枝。
从 i = start 到数组末尾循环:
    选择当前元素 candidates[i] 加入 path;
    递归调用,start 仍然传 i(表示还能继续使用当前元素,支持重复选);
    递归结束后,将刚才加入的元素弹出(回溯),尝试下一个候选。

start 不倒退(只往后走),保证了不会出现组合顺序不同但内容相同的重复解。


与「只用一次」问题的区别

很多同学会把它和「每个元素只能用一次」的组合题搞混,这两类题的递归写法只差一个地方:

  • 本题 元素可以重复使用,所以递归时传入的是 dfs(i, ...),即继续从当前下标开始。
  • 如果是「每个元素只能用一次」,通常会传 dfs(i + 1, ...),表示这个元素用过就不能再选了。

这个差别非常重要,也可以当成一个背诵模板:

  • 可重复选dfs(target - a[i], i)
  • 不可重复选dfs(target - a[i], i + 1)

可以从这道题学到什么

这道题是回溯类题目的入门 / 模板题之一,可以总结出几条通用经验:

  1. 先想清楚「状态」:路径 path、当前位置 start、还需要的目标值 remain。
  2. 先写好「终止条件」:remain == 0 收集答案,remain < 0 剪枝返回。
  3. 遍历时控制好起点 start,避免重复组合;是否允许重复选择当前元素,取决于递归时传 i 还是 i + 1。
  4. 每次递归前后,配对使用「选一个元素 」和「撤销这个元素」操作,保持 path 的正确性,这就是回溯的核心模板。

掌握了这道题的模板后,可以很自然地过渡到 Combination Sum II、子集、排列等其他常见回溯题,只是「是否允许重复」「是否有重复元素」「是否要排序及剪枝策略」略有不同。

相关推荐
图码21 分钟前
如何用多种方法判断字符串是否为回文?
开发语言·数据结构·c++·算法·阿里云·线性回归·数字雕刻
handler0129 分钟前
Linux 内核剖析:进程优先级、上下文切换与 O(1) 调度算法
linux·运维·c语言·开发语言·c++·笔记·算法
minglie136 分钟前
实数列的常用递推模式
算法
代码小书生1 小时前
math,一个基础的 Python 库!
人工智能·python·算法
AI科技星1 小时前
全域数学·数术本源·高维代数卷(72分册)【乖乖数学】
人工智能·算法·数学建模·数据挖掘·量子计算
生成论实验室1 小时前
《事件关系阴阳博弈动力学:识势应势之道》第一篇:生成正在发生——从《即事经》到事件-关系网络
人工智能·科技·算法·架构·创业创新
漂流瓶jz1 小时前
UVA-1152 和为0的4个值 题解答案代码 算法竞赛入门经典第二版
数据结构·算法·二分查找·题解·aoapc·算法竞赛入门经典·uva
leoufung1 小时前
LeetCode 76:Minimum Window Substring 题解与滑动窗口思维详解
算法·leetcode·职场和发展
小O的算法实验室1 小时前
2026年IEEE TETCI,山区环境下基于双种群进化的协同无人机巡逻任务协同优化,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
生成论实验室2 小时前
《事件关系阴阳博弈动力学:识势应势之道》第二篇:阴阳博弈——认知的动力学基础
数据结构·人工智能·科技·神经网络·算法