题目描述
思路: 主要还是考虑传什么参数,递归的出口,如何划分子集
code:
#include <iostream>
using namespace std;
const int N = 1e6 + 10;
int n, cnt;
int p[N];
void dfs(int cur, int x)
{
if(cur == 0) //每次用过一个数,就将cur减去该数,当cur为0时,完成
{
printf("%d=", n);
for(int i = 1; i < cnt; i ++ ) printf("%d+", p[i]);
printf("%d\n", p[cnt]);
}
//从当前最小值开始枚举,递归重复处理该较小值
for(int i = x; i < n && i <= cur; i ++ ) //当前枚举的值小于输入的最大值n,小于等于所能减去的值cur
{
p[++ cnt] = i;
dfs(cur - i, i); //递归到下一层
//回溯到上一层,此时更新cur(变大)去找新的满足条件的数,同时回溯用来更新当前所存答案的p[]
p[cnt -- ] = 0;
}
}
int main()
{
cin >> n;
dfs(n, 1); //从1开始往下算
return 0;
}