传送门
题意好像说的不太清楚?
这题不剪枝样例都跑不过。。。
Solution
只要预处理一个数组
数组b[i]表示当前数列最大值为i时,还需要的最小长度
b[i]=b[i<<1]+1
Code
// by spli
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
int n;
int a[105],b[220];
int ans,r[105];
bool flag;
void dfs(int k){
if(k+b[a[k]]>=ans) return;
if(a[k]==n){
ans=k;
for(int i=0;i<=k;++i) r[i]=a[i];
return;
}
for(int i=k;i>=0;--i)
for(int j=i;j>=0;--j)
if(a[i]+a[j]<=n){
if(a[i]+a[j]<a[k]) break;
a[k+1]=a[i]+a[j];
dfs(k+1);
//if(flag) return;
}
}
int main(){
a[0]=1;
while(scanf("%d",&n)&&n){
for(int i=n;i<=n*2;++i) b[i]=0;
for(int i=n-1;i>=1;--i) b[i]=b[i<<1]+1;
flag=0;ans=0x3f3f3f3f;
dfs(0);
for(int i=0;i<=ans;++i) cout<<r[i]<<" ";cout<<endl;
}
return 0;
}