✨题目链接:
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;
}
※ 如果文章对你有帮助的话,可以点赞收藏!!谢谢支持