|
沙发
楼主 |
发表于 2015-11-1 00:32:15
|
只看该作者
- #include<iostream>
- #include<iomanip>
- using namespace std;
- int a[200],x,y,n,iiii;
- bool can(int i,int k) //判断前面i-1个数字中能有某两个数字之和为k
- {
- bool bb=false;
- for (int ii=0; ii<=i; ii++)
- for (int jj=0; jj<=i; jj++)
- if (a[ii]+a[jj]==k) bb=true; //很笨的做法没有优化
- return bb;
- }
- void dfs(int i)
- {
- int j,k;
- if (i>=n) //达到预定的长度就不再往下找了
- {
- if (a[n-1]==x) //符合要求的话
- {
- for (j=0; j<=n-1; j++) cout<<setw(3)<<a[j];
- cout<<endl;
- n--; //下次就最大长度减一
- }
- }
- else
- for (k=1+a[i-1]; k<=(2*a[i-1]); k++) // 下一个数字的范围若能由大到小更好
- if (can(i-1,k))
- {
- a[i]=k;
- dfs(i+1);
- }
- }
- int main()
- {
- x=20;
- n=20;//假设最大值要算20次,这个是很保守的。
- a[0]=1; a[1]=2; //前面两个数字没有选择只能是1和2
- dfs(2);//从第三个数字开始搜索
- }
复制代码 |
|