#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
#include <limits.h>	
#define inf (INT_MAX-1)
#define INF 9223372036854775807
#define sq(n) ((n)*(n))
#define rep(i,n) for(i=0;i<n;i++)
#define rev(i,n) for(i=n-1;i>=0;i--)
const int mod=(int)1e09+7;

int in(void){
	int i;scanf("%d",&i);
	return i;
}
long long llin(void){
	long long i;scanf("%lld",&i);
	return i;
}
double din(void){
	double i;scanf("%lf",&i);
	return i;
}
void chin(char s[]){
	scanf("%s",s);
}
void print(int a){
	printf("%d\n",a);
}
void llprint(long long a){
	printf("%lld\n",a);
}
void dprint(double a){
	printf("%.10f\n",a);
}
void print2(int a,int b){
	printf("%d %d\n",a,b);
}
long long max(long long a,long long b){
	return a>b?a:b;
}
long long min(long long a,long long b){
	return a<b?a:b;
}
double dmax(double a,double b){
	return a>b?a:b;
}
int cmp(const void *a,const void *b){
	return *(long long *)a-*(long long *)b;
}

int dp[1000000];
int dp_o[1000000];
int tetra[200];
int tetra_o[200];

int main(void){
	int n,t,i,j;
	t=0;
	rep(i,200){
		tetra[i]=i*(i+1)*(i+2)/6;
		if(tetra[i]%2){
			tetra_o[t++]=tetra[i];
		}
	}
	rep(i,1000000){
		dp[i]=dp_o[i]=inf;
	}
	dp[0]=dp_o[0]=0;
	rep(i,200){
		for(j=tetra[i];j<1000000;j++){
			dp[j]=min(dp[j],dp[j-tetra[i]]+1);
		}
	}
	rep(i,t){
		for(j=tetra_o[i];j<1000000;j++){
			dp_o[j]=min(dp_o[j],dp_o[j-tetra_o[i]]+1);
		}
	}
	while(1){
		scanf("%d",&n);
		if(!n) break;
		printf("%d %d\n",dp[n],dp_o[n]);
	}
	return 0;
}