题目描述
输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来
输入描述:
每个测试输入包含2个整数,n和m
输出描述:
按每个组合的字典序排列输出,每行输出一种组合
示例1
输入
5 5
输出
1 4 2 3 5
//参考http://www.cnblogs.com/BLoodMaster/archive/2010/03/23/1692641.html
//参考https://www.nowcoder.com/questionTerminal/11cc498832db489786f8a03c3b67d02c?toCommentId=428428
//重要的递归算法的一般形式
/*
void func( mode){
if(endCondition){
constExpression //基本项
}
else
{
accumrateExpreesion /归纳项
mode=expression //步进表达式
func(mode) / /调用本身,递归
}
}
*/
void function(int n, int m, vector<int>& v, int bag) {
if (m == 0) {//3
for (int i = 0; i<v.size(); i++) {
i == 0 ? cout << v[i] : cout << " " << v[i];
}
cout << endl;
}
for (int i = bag; i <= n&&i <= m; i++) {
v.push_back(i);//1
function(n, m - i, v, i + 1);//2
v.pop_back();//4
//1.m为所求的和,当找到一个符合的值的时候把该i值传入容器,
//2.同时和也要减去这个值,然后传入的第四个参数要i+1,因为i已经放到容器了,就从下一个数据取,
//3.直到和为零的时候,则容器里保存的数据就是所要的结果
//4.当遍历完的结果m不为零则执行pop.back操作把这些没用的数据释放掉
}
}
int main() {
int n, m;
//n表示为有1-n这些数,m表示从1-n中取几个数相加正好为m
while (cin >> n >> m) {
//保存结果的容器
vector<int>v;
//第四个参数表示第一个数就是为1存进容器
function(n, m, v, 1);
}
}