不知蓝书的标程在说什么,,,,于是自己想了一下。。。发现自己的代码短的一批。。。
限制搜索深度+枚举时从大往小枚举,以更接近n+bool判重,避免重复搜索
#include<cstdio> #include<iostream> #include<cstring> #define R register int using namespace std; inline int g() { R ret=0; register char ch; while(!isdigit(ch=getchar())); do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret; } int n,dep=1; int a[110]; bool v[110]; inline bool dfs(int crt) { if(crt==dep+1) return a[dep]==n; for(R i=crt-1;i>=1;--i) for(R j=i;j>=1;--j) { if(a[i]+a[j]>n) continue; if(a[i]+a[j]<=a[crt-1]) break; if(v[a[i]+a[j]]) continue; a[crt]=a[i]+a[j]; if(dfs(crt+1)) return true; } return false; } signed main() { while(n=g(),n!=0) { dep=1; memset(a,0,sizeof(a));memset(v,false,sizeof(v)); a[1]=1; while(!dfs(2)) ++dep; for(R i=1;i<=dep;++i) printf("%d ",a[i]); putchar(' '); } }
2019.04.26