constint maxn=1010; int n,a[30],dep; bool b[maxn]; #define max(a,b) (a>b?a:b)
booliddfs(int x,int mv) {/* if (x>dep) return 0;*/ if (x==dep) return a[x]==n; if (a[x]>mv) mv=a[x]; if (a[x]>=n||1ll*mv*(1<<dep-x)<n) return0; /* if (1ll*mv*(1<<dep-x)<n) return 0;*/ registerint i,t; for (i=1;i<=x;i++) if (!b[t=a[x]+a[i]]) { b[t]=1; a[x+1]=t; if (iddfs(x+1,mv)) return1; b[t]=0; // a[tot+1]=0; } for (i=1;i<=x;i++) if ((t=a[x]-a[i])>=1&&!b[t]) { b[t]=1; a[x+1]=t; if (iddfs(x+1,mv)) return1; b[t]=0; // a[tot+1]=0; } }
intmain() { int i; while (~scanf("%d",&n)&&n) { // memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); a[1]=1; dep=1; b[1]=1; for (i=1;;i++) if (!iddfs(1,1)) dep++; else break; printf("%d\n",dep-1); } return0; }