思路点拨:
看到这题,首先就会想到用深搜。对,这道题的正解的确是深搜。
可搜什么呢?假如你看到一道题给出的数字是5,让你拆分,你会怎么分呢?
相信大家的思路都是这样的:
首先确定第一个数字,从小的开始,也就是说第一个数字可以是1。
接下来,我们发现,1后面数字相加的和,只可能是5-1=4。
紧接着,我们把4来拆分,还是从1开始拆,那么现在的算式就变成了1+1。
那后面拆分的总和应该是5-2/4-1=3,以此类推,最终拆成1+1+1+1+1。
那如果第一个数拆2呢,那么剩下的数相加得5-2=3。
再把3拆分,最后得出结果。
这是我们人的思路,那程序怎么写呢?
我们可以dfs(cur,sum),表示当前考虑cur,还剩sum需要划分。
注意:在dfs里因该有两种情况,分别是选或不选。
最后奉上完整代码。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int n,t=0,a[10000];
void dfs(int cur,int sum)//考虑cur,还剩下sum需要划分
{
//当没有余下的(没有需要划分时),输出答案
if(sum==0)
{
cout<<a[0];
for(int i=1;i<t;i++) cout<<"+"<<a[i];
cout<<endl;
return;
}
//如果要考虑的这个数比剩下要划分的大,没办法选,return
//如果考虑的这个数等于输入的数,不成立,因为拆分至少有两个数,return
if(cur>sum||cur==n) return;
a[t++]=cur;//把考虑的数加入答案数组
dfs(cur,sum-cur);//选cur
t--;//回溯
dfs(cur+1,sum);//不选cur
}
int main()
{
cin>>n;
dfs(1,n);
return 0;
}
我还是一名小学生,希望大家多多支持,拜拜!