#include <bits/stdc++.h>
using namespace std;
const int mx=1000000001+100000;
int n;
vector<int> g;
int dfs(int num,int cnt,int limit)
{
if(num==0) return 0;
int p=upper_bound(g.begin(),g.end(),num)-g.begin()-1;
p=min(p,limit);
while(p>=0&&num/g[p]<cnt)
{
cnt=min(dfs(num-g[p],cnt-1,p)+1,cnt);
if(cnt<=2) break;
p--;
}
return cnt;
}
int main()
{
for(int i=1;i*i<mx;i++)
{
g.push_back(i*i);
}
while(scanf("%d",&n),n!=-1)
{
if(n==0) {cout<<"1"<<endl;continue;}
int lim=upper_bound(g.begin(),g.end(),n)-g.begin()-1;
cout<<dfs(n,5,lim)<<endl;
}
return 0;
}
加了点优化,有些可能没有必要,懒得改了,好像最多不超过四个完全平方数