[leetcode 216] Combination Sum III ------组合数的和(回溯法)

来源:互联网 发布:jquery怎么渲染数据 编辑:程序博客网 时间:2024/06/06 09:09

Question:

Find all possible combinations of k numbers that add up to a number n, given that only numbers from 1 to 9 can be used and each combination should be a unique set of numbers.

Ensure that numbers within the set are sorted in ascending order.


Example 1:

Input: k = 3, n = 7

Output:

[[1,2,4]]


Example 2:

Input: k = 3, n = 9

Output:

[[1,2,6], [1,3,5], [2,3,4]]

分析:

题目意思是,k表示元素个数,n表示这k个元素的和,每个元素只能是1-9的排列,而且元素不能有重复。

思路是:

回溯法。可以很容易的把解空间树画出来,就是第一层1的两个分支为:有1和无1,第二层表示2的两个选择分支。。。。

剪枝条件也很明确,元素个数比k大了,总和比n大了。


代码如下:

<span style="font-size:14px;">class Solution {public:    vector<vector<int>> combinationSum3(int k, int n) {        vector<vector<int>> res;        vector<int> temp;        if(k <= 0 || n <= 0 || n > 45 || k >= n || k > 10){            return res;        }        int countK = 0;        int Sum = 0;        if(k == 1){            if(n <= 9){                temp.push_back(n);                res.push_back(temp);            }            return res;        }        helper(temp,0,k,n,1,res);        return res;    }    void helper(vector<int>& temp,int sum,int k,int n,int cur,vector<vector<int>>& res){               if(temp.size() == k){            if(sum == n)                res.push_back(temp);            return;        }        for(int i = cur; i <= 9; ++i){            temp.push_back(i);            helper(temp,sum+i,k,n,1+i,res);            temp.erase(temp.end()-1);        }    }};</span>


0 0
原创粉丝点击