44 lines
1.1 KiB
C++
44 lines
1.1 KiB
C++
#include <bits/stdc++.h>
|
||
using namespace std;
|
||
int n, m;
|
||
vector<int> vec;
|
||
/*
|
||
输入:
|
||
13 3
|
||
|
||
答案:
|
||
1 2 10
|
||
1 3 9
|
||
1 4 8
|
||
1 5 7
|
||
2 3 8
|
||
2 4 7
|
||
2 5 6
|
||
3 4 6
|
||
*/
|
||
void dfs(int x, int c) {
|
||
// 注意下面的两层判断!!!
|
||
if (x == 0) { // 这是递归出口
|
||
|
||
if (c == m) { // 不是所有到达递归出口的方案都是可行的,只有到达递归出口并且,数量等于m的方案才是可行的
|
||
for (int i = 0; i < vec.size(); i++)
|
||
cout << vec[i] << " ";
|
||
cout << endl;
|
||
}
|
||
// 这个return是配合递归出口设置的,不管方案是不是可行,都要结束递归。
|
||
return;
|
||
}
|
||
|
||
// 当前位置可以放下每个小于等于x的数字
|
||
for (int i = !vec.size() ? 1 : vec.back() + 1; i <= x; i++) { // 三元表达式:如果vec.size()为0,则i=1,否则i=vec.back()+1
|
||
vec.push_back(i); // 回溯法
|
||
dfs(x - i, c + 1); // 数字在减少,个数在增加,vec是大黑板,c是小纸条
|
||
vec.pop_back();
|
||
}
|
||
}
|
||
|
||
int main() {
|
||
cin >> n >> m;
|
||
dfs(n, 0);
|
||
return 0;
|
||
} |