😊😊 😊😊
不求点赞,只求耐心看完,指出您的疑惑和写的不好的地方,谢谢您。本人会及时更正感谢。希望看完后能帮助您理解算法的本质
😊😊 😊😊
题目描述:
小白到进阶各种解法:
一、暴搜:😊
思路:
- 如果说是循环枚举的话,则需要 n n n 重循环枚举。 2 ≤ n ≤ 9 2\le n\le9 2≤n≤9,好像也不大。。。不过正解还是递归搜索。
- 递归分析:本题的本质为:从 1 ⇒ n 1⇒ n 1⇒n 中选,每个数可以选无穷多件。枚举所有的选法,判断该序列是否合法。
- 且要求字典序最小,则需要保证我们的字典序,则从小到大枚举,利用last变量的不降原则!
- 递归的出口:当前序列的元素和 > n 时,返回;==n 时,进行输出。
- 递归的参数:sum:序列和。last:不降原则!
- 递归体:循环枚举 1~n-1;
代码:
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int n;
vector<int> path;
void dfs (int last, int sum)
{
if (sum > n) return ;
if (sum == n) {
int len = path.size();
for (int i=0; i < len-1; i ++)
cout << path[i] << "+";
cout << path[len-1];
puts("");
return ;
}
for (int i=last; i <= n-1; i ++)
{
path.push_back(i);
dfs (i, sum + i);
path.pop_back();
}
}
int main()
{
cin >> n;
dfs (1, 0);
return 0;
}