题意很好懂,给一个数n,找到一个序列 ,最后一个数的值为n,第一个数的值为1,序列递增且相邻的数都不相等,
对于每个k k∈2~m,都存在两个在1~k-1范围内的i,j(i,j可以相等) 使得x【k】=x【i】+x【j】 使序列的长度m尽可能短,
可确定答案在比较小的范围内,所以采用迭代加深的方法,在搜索深度为一个定值的情况下找不到,那么就将深度+1,再次进行搜索。
代码:
#include<bits/stdc++.h>
using namespace std;
int n,str[100],dep;
bool dfs(int now)
{
if(now==dep) return str[now]==n;
for(int i=now ;i>=1;i--)
for(int j=i;j>=1;j--)
{
int num=str[i]+str[j];
if(num>str[now]&&num<=n)
{ str[now+1]=num;
if(dfs(now+1)) return 1;
}
}
return 0;
}
int main()
{ str[1]=1;
while(cin>>n&&n)
{
dep=1;
while(!dfs(1)) ++dep;
for(int i=1;i<=dep;i++)
cout<<str[i]<<" ";
cout<<endl;
}
}