一、题目
二、代码
#pragma warning(disable:4996)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;
#include<vector>
int n;
std::vector<int> ans;
void DFS(int last, int remain)
{
if (!remain)
{
// TODO: 处理递归终点,输出结果
for (int i = 0; i < ans.size() - 1; i++)
{
cout << ans[i] << "+";
}
cout << ans[ans.size() - 1] << endl;
}
for (int i = last; i <= remain; i++)
{
// TODO: 枚举可能性,进行回溯
if (i != n)
{
ans.push_back(i);
DFS(i, remain - i);
ans.pop_back();
}
}
}
int main()
{
while (scanf("%d", &n) != EOF)
{
ans.clear();
DFS(1, n);
}
return 0;
}
三、总结
1.枚举可能性,进行回溯。部分流程如下图
2.在深度搜索完成,将进行回溯前,要先弹出该节点。