leecode 解题总结:216. Combination Sum III

#include <iostream>
#include <stdio.h>
#include <vector>
#include <string>
using namespace std;
/*
问题:
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.
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]]


分析:比较明显的回溯问题,需要从1到9中选择k个数字,使得累加和等于指定值,
其中每个数字只能使用一次


输入:
3 7
3 9
1 1
2 1
2 20
输出:
1 2 4
1 2 6,1 3 5,2 3 4
1
no result
no result


关键:
1 回溯算法的一般形式为
  backTrace(起始位置,...)
  {
     //判定找到正确答案,并保存
if(找到答案)
{
   保存结果
}
i从起始位置开始,遍历i
  if(i满足题目条件)
  {
     向结果中保存当前值
 backTrace(i+1,...)//回溯,并从下一个地方开始
 从结果中删除刚才保存的值
  }
  }
*/


class Solution {
public:
void backTrace(int beg ,int k ,int n, int currentSum, vector<int>& result , vector< vector<int> >& results )
{
//已经找到k个数字
if((!result.empty()) && result.size() == k && currentSum == n)
{
results.push_back(result);
return;
}
for(int i = beg ; i <= 9 ; i++ )
{
//当前数加上累加和小于
if(i + currentSum <= n)
{
result.push_back(i);
backTrace(i+1 , k , n , i + currentSum , result , results);
result.pop_back();
}
}
}


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


void print(vector<vector<int> >& result)
{
if(result.empty())
{
cout << "no result" << endl;
return;
}
int size = result.size();
int len;
for(int i = 0 ; i < size ; i++)
{
len = result.at(i).size();
for(int j = 0 ; j < len ; j++)
{
cout << result.at(i).at(j) << " " ;
}
cout << endl;
}
}


void process()
{
int k;
int n;
Solution solution;
vector<vector<int> > result;
while(cin >> k >> n )
{
result = solution.combinationSum3(k , n);
print(result);
}
}


int main(int argc , char* argv[])
{
process();
getchar();
return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值