题目链接:传送门(点我)
#include<bits/stdc++.h>
using namespace std;
int a[50]={1},n;
void pr(int step)
{
for(int i=1;i<=step-1;i++)
cout<<a[i]<<"+";
cout<<a[step]<<endl;
}
void dfs(int sum,int step)
{
for(int i = a[step-1];i<=sum;i++){
if(i<n){
a[step]=i;
sum-=i;
if(sum==0)pr(step);
else dfs(sum,step+1);
sum+=i;
}
}
}
int main()
{
cin>>n;
dfs(n,1);
return 0;
}
思考了一下:其实回溯是因为状态发生了变化,而这种变化后会影响到之前,那么由于递归调用时,局部函数的变量只在局部有效,也就是说,在计算机中,函数栈中保留了之前的信息,那么可以利用这点来dfs。
小优化一下
#include<bits/stdc++.h>
using namespace std;
int ans[30]={1},n;
void pr(int step)
{
for(int i=1;i<step;i++)
cout<<ans[i]<<"+";
cout<<ans[step]<<endl;
}
void dfs(int sum,int step)
{
for(int i=ans[step-1];i<=sum;i++){
if(i<n){
ans[step]=i;
sum-i==0?pr(step):dfs(sum-i,step+1);
}
}
}
int main()
{
cin>>n;
dfs(n,1);
return 0;
}