/*
AizuOnline A1167
Maximum Sum Sequence
*/
#include <stdio.h>
#include <limits.h>
#define MAXVAL 1000000
#define MAX4MENNO 182
#define MAX4MENNOODD 46
int simen_table[MAX4MENNO+1];
int simen_odd_table[MAX4MENNO+1];
int polloc_table[MAXVAL];
int polloc_odd_table[MAXVAL];
int N;


void make_simen()
{
  int i,j,k,l;
  int simen,wa1,wa2,wa3,wa4;

  for(i=0;i<MAXVAL;i++)
    polloc_table[i]=INT_MAX;

  for(i=1;i<=MAX4MENNO;i++)
    {
      wa1 = (i*(i+1)*(i+2))/6;
      simen_table[i]=wa1;
      
      if(wa1 < MAXVAL && polloc_table[wa1] > 1)
	polloc_table[wa1]=1;
    }


  for(i=1;i<=MAX4MENNO;i++)
    for(j=i;j<=MAX4MENNO;j++)
      {
	wa2 = simen_table[i]+simen_table[j];
	if(wa2 < MAXVAL && polloc_table[wa2] > 2)
	  polloc_table[wa2]=2;
	for(k=j;k<=MAX4MENNO;k++)
	  {
	    wa3 = wa2 + simen_table[k];
	    if(wa3 < MAXVAL && polloc_table[wa3] > 3)
	      polloc_table[wa3]=3;
	    for(l=k;l<=MAX4MENNO;l++)
	      {
		wa4 = wa3 + simen_table[l];
		if(wa4 < MAXVAL && polloc_table[wa4] > 4)
		  polloc_table[wa4]=4;
	      }
	  }
      }

  //for(i=1;i<=10;i++)
    // printf("p%d:%d\n",i,polloc_table[i]);
}

void make_simen_odd()
{   
  int i,j,j1,k,simen;

  for(i=1;i<=MAX4MENNO;i++)
    {
      j=(i-1)*4+1;
      simen_odd_table[i]=j*(j+1)*(j+2)/6;
      //if(i<10)
      //printf("%d\n",simen_odd_table[i]);
    }
  for(i=1;i<MAXVAL;i++)
    polloc_odd_table[i]=INT_MAX;
  
  for(i=1;i<simen_odd_table[2];i++)
    polloc_odd_table[i]=i;

  //  for(i=2;i<=MAX4MENNOODD;i++)
  for(i=2;i<=4;i++)
    for(simen=simen_odd_table[i],j=simen,j1=1;j<MAXVAL;j+=simen,j1++)
      for(k=0;k<simen;k++)
	if(polloc_odd_table[j+k] > j1+polloc_odd_table[k])
	  polloc_odd_table[j+k] = j1+polloc_odd_table[k];
}
int polloc(int n)
{
  int i,k1,k2,ret,mink;
  //printf("N:%d;",n);
  ret=polloc_table[n];

  if(ret != INT_MAX)
    return(ret);
  mink=INT_MAX;
  for(i=1;i<=n/2;i++)
    { 
      k1=polloc(i);
      if(k1 > mink -1)
	continue;
      k2=polloc(n-i);
      if(k2 > mink -1)
	continue;
      if(mink > k1+k2)
	mink = k1+k2;
      if(mink==2)
       break;
    }
    return(mink);  
}

int polloc_odd(int n)
{
  return(polloc_odd_table[n]);
}

main()
{
  int ret,ret1;

  make_simen();
  make_simen_odd();
  while (EOF != scanf("%d",&N) && N)
    {
      ret=polloc(N);
      ret1=polloc_odd(N);

      printf("%d %d\n",ret,ret1);
    }

return(0);
}