#include using namespace std; int n, m; vector 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; }