#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;
}
#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;
}