DPする。
#include<iostream>
#include <algorithm>
using namespace std;
typedef long long int lli;
const lli inf = 1LL << 60;
const lli N = 400000 + 1;
lli dp[N];
const lli S = 180;
lli sum[S];
int main(void)
{
sum[0] = 0;
for (lli i = 1; i < S; ++i) {
sum[i] += sum[i - 1] + i * i;
}
fill(dp, dp + N, inf);
dp[0] = 0;
for (lli i = 0; i < N; ++i) {
for (lli j = 0; j < S; ++j) {
if (i + sum[j] < N) ; else break;
dp[i + sum[j]] = min(dp[i + sum[j]], dp[i] + 1);
}
for (lli j = 0; j * j * j < N; ++j) {
lli k = j * j * j;
if (i + k < N) ; else break;
dp[i + k] = min(dp[i + k], dp[i] + 1);
}
}
int n;
while (cin >> n) {
if (n == -1) break;
cout << dp[n] << endl;
}
return 0;
}