#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=1e4+5;
int n,maxx,ans[maxn];
bool dfs(int step){
if(ans[step-1]*(1<<(maxx-step+1))<n) return false;
if(step>maxx) return ans[step-1]==n;
for(int i=0;i<step;i++)
for(int j=i;j<step;j++){
int now=ans[i]+ans[j];
if(now>n) break;
if(now<=ans[step-1]) continue;
ans[step]=now;
if(dfs(step+1)) return true;
}
return false;
}
signed main(){
ans[0]=1;
while(cin>>n&&n){
printf("1");
for(maxx=;;maxx++){
if(dfs(1)){
for(int i=1;i<=maxx;i++) printf(" %lld",ans[i]);
puts("");
break;
}
}
}
}
迭代加深板子题,这是AC代码,但是无法理解,dfs里面i和j都是从小开始枚举的,应该是无法保证路径最短的吧,但是确实保证了路径最短,这是为什么?