当前位置: 首页> 财经> 访谈 > 193.回溯算法:组合总和(力扣)

193.回溯算法:组合总和(力扣)

时间:2025/9/6 16:44:44来源:https://blog.csdn.net/weixin_63779802/article/details/139901290 浏览次数:0次

代码解决

class Solution {
public:vector<int> res; // 当前组合的临时存储vector<vector<int>> result; // 存储所有符合条件的组合// 回溯函数void backtrcing(vector<int>& nums, int target, int flag, int index) {// 如果当前组合的和超过了目标值,则返回if (flag > target) return;// 如果当前组合的和等于目标值,则将当前组合加入结果集if (flag == target) {result.push_back(res);return;}// 遍历候选数组for (int i = index; i < nums.size(); i++) {flag += nums[i]; // 将当前元素加入组合和res.push_back(nums[i]); // 将当前元素加入当前组合backtrcing(nums, target, flag, i); // 递归调用回溯函数,允许重复使用当前元素flag -= nums[i]; // 回溯,移除当前元素res.pop_back(); // 回溯,移除当前元素}}// 主函数vector<vector<int>> combinationSum(vector<int>& candidates, int target) {backtrcing(candidates, target, 0, 0); // 初始调用回溯函数return result; // 返回所有符合条件的组合}
};

测试用例

输入

vector<int> candidates = {2, 3, 6, 7}; int target = 7;

输出

[ [2, 2, 3], [7] ]

过程描述

  1. 初始状态

    • candidates = {2, 3, 6, 7}
    • target = 7
    • res = [](当前组合为空)
    • result = [](所有符合条件的组合为空)
  2. 递归回溯

    • 从第一个元素 2 开始:
      • flag = 2res = [2],继续递归。
      • 再次选择 2
        • flag = 4res = [2, 2],继续递归。
        • 再次选择 2
          • flag = 6res = [2, 2, 2],继续递归。
          • 再次选择 2
            • flag = 8,超过目标值,回溯,移除最后一个 2
        • 尝试选择 3
          • flag = 7res = [2, 2, 3],符合目标值,将组合加入 result,回溯,移除最后一个 3
        • 尝试选择 67
          • 超过目标值,回溯。
      • 尝试选择 3
        • flag = 5res = [2, 3],继续递归。
        • 再次选择 3
          • 超过目标值,回溯。
        • 尝试选择 67
          • 超过目标值,回溯。
    • 尝试选择 3
      • flag = 3res = [3],继续递归。
      • 再次选择 3
        • flag = 6res = [3, 3],继续递归。
        • 尝试选择 367
          • 超过目标值,回溯。
    • 尝试选择 6
      • flag = 6res = [6],继续递归。
      • 尝试选择 67
        • 超过目标值,回溯。
    • 尝试选择 7
      • flag = 7res = [7],符合目标值,将组合加入 result

最终,result 包含所有符合条件的组合 [[2, 2, 3], [7]]

关键字:193.回溯算法:组合总和(力扣)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: