✨题目链接:
OR64 求和
 ✨题目描述 
 
输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来
✨输入描述:
每个测试输入包含2个整数,n和m
✨输出描述:
  
 
按每个组合的字典序排列输出,每行输出一种组合
✨示例1
 📍输入
 
 
5 5
📍输出
1 4 
 2 3 
 5  
✨解题思路
DFS+回溯

回溯逻辑:
- 如果currentSum等于m,则将currentCombination添加到结果集中,并返回。
- 如果currentSum大于m或startIndex大于n,则剪枝,直接返回(因为不需要考虑更大的数字或索引超出范围的情况)。
- 否则,从startIndex开始,逐个尝试将数字加入currentCombination,并递归调用回溯函数,传入下一个数字索引(startIndex + 1)和更新后的currentSum。
 ✨代码
  
 
#include <iostream>  
#include <vector>  
  
using namespace std;  
  
void backtrack(int n, int m, int startIndex, int currentSum, vector<int>& currentCombination, vector<vector<int>>& results) {  
    if (currentSum == m) {  
        results.push_back(currentCombination);  
        return;  
    }  
    if (currentSum > m || startIndex > n) {  
        return;  
    }  
    for (int i = startIndex; i <= n; ++i) {  
        currentCombination.push_back(i);  
        backtrack(n, m, i + 1, currentSum + i, currentCombination, results);  
        currentCombination.pop_back(); // 回溯  
    }  
}  
  
int main() {  
    int n, m;  
    cin >> n >> m;  
    vector<vector<int>> results;  
    vector<int> currentCombination;  
    backtrack(n, m, 1, 0, currentCombination, results);  
      
    // 按字典序打印结果  
    for (const auto& combination : results) {  
        for (int num : combination) {  
            cout << num << " ";  
        }  
        cout << endl;  
    }  
    return 0;  
}
※ 如果文章对你有帮助的话,可以点赞收藏!!谢谢支持




![【Linux】-Zookeeper安装部署[17]](https://img-blog.csdnimg.cn/direct/70e7538e21684fe8a42dbfb56778c087.png)














