题意:
给定一个数字生成一个序列要使得序列中的元素满足递增且每个数都能用他前面的两个数(可以是一个数的两倍)相加得到。
思路:
第一个数和第二个数肯定是1和2,然后再根据层数和数要递增这些限制来进行dfs。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
int x[maxn];
bool vis[maxn];
int n;
int dfs(int now,int deep,int last) {
if(x[now] == n) return now;
if(now>=deep) return 0;
for(int i=now;i;i--) {
for(int j=i;j;j--) {
if(!vis[x[i]+x[j]] && x[i]+x[j]>=last) {
x[now+1] = x[i]+x[j];
vis[x[i]+x[j]] = true;
if(dfs(now+1,deep,x[now]+1)) return true;
vis[x[i]+x[j]] = false;
x[now+1] = 0;
} else if(!vis[x[i]+x[j]]) {
break;
}
}
}
return 0;
}
int main()
{
while(cin>>n && n) {
x[1] = 1;
x[2] = 2;
int k = n;
if(n>2) {
if(n>20) {
k = 6;
} else {
k = 3;
}
for(;k<=10;k++) {
memset(vis,false,sizeof(vis));
memset(x,0,sizeof(x));
x[1] = 1;
x[2] = 2;
if(dfs(2,k,3)) break;
}
}
for(int i=1;i<=k;i++) cout<<x[i]<<" ";cout<<endl;
}
}