【回溯】【leetcode】找出所有相加之和为 n 的 k 个数的组合

题目:

找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。

说明:

  • 所有数字都是正整数。
  • 解集不能包含重复的组合。 

例:

输入: k = 3, n = 7
输出: [[1,2,4]]

来源:

216. 组合总和 III

解题思路:回溯

继续学习回溯的思想,本题与 上一篇(所有组合) 非常相似,直接借鉴。

  • 递归终止条件:满足k个数
  • 结果输出条件:满足k个数 && 满足sum
  • 剪枝条件:当前虽然不足k个数,但其和即将超过目标值

c++代码:

class Solution {
public:
    vector< vector<int> > result;
    vector<int> path;

    vector< vector<int> > combinationSum3(int k, int n) {
        back(n, 0, k, 1);
        return result;
    }

    // targetSum:目标和,固定值
    // currentSum:当前path中的数字和,动态累加
    void back(int targetSum, int currentSum, int k, int start) {
        if (path.size() == k) {
            if (currentSum == targetSum) {
                result.push_back(path);
            }
            return;
        }
        for (int i = start; i <= 9; i++) {
            if (currentSum + i > targetSum) break; // 剪枝,后面的数字已超出
            currentSum += i;
            path.push_back(i);
            back(targetSum, currentSum, k, i+1);
            currentSum -= i;
            path.pop_back();
        }
    }
};

猜你喜欢

转载自blog.csdn.net/hbuxiaoshe/article/details/114825220