/*
题意:
买一块边长为 a(为整数) 的正方形地需要的钱数是 a^2, 现在输入N为钱数,
为了交税方便,求最少购买地的块数。
分析:
输入n就代表可购买面积为n的地
dp[i]为购买面积为i的地最少的土地块数,则
遍历j:1~n,表示当前选边长为j的土地,情况有二:选或是不选
不选:dp[i]=dp[i-1]+1;
选并且i-j*j>=0:dp[i]=dp[i-j*j]+1;
注意,最后还需要取最小!是从dp[i],dp[i-1]+1,dp[i-j*j]+1中取最小。。
开始我用的转移方程为dp[i]=min(dp[i-1]+1,dp[i-j*j]+1)。。然后wa。。
后来发现。。。。。。。还需要加一个min(dp[i])。。。。
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <limits.h>
using namespace std;
typedef long long ll;
ll dp[64000];
int main()
{
int n;
while(~scanf("%d",&n))
{
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)//遍历面积
{
dp[i]=dp[i-1]+1;
for(int j=1;j*j<=n;j++)
{
if(i-j*j>=0)
dp[i]=min(dp[i],dp[i-j*j]+1);
}
//printf("%I64d%c",dp[i],i%5==0?'\n':' ');
}
printf("%I64d\n",dp[n]);
}
return 0;
}