#include #include #include using namespace std; vector more_one_or_two; int dp[10000001]; int choose(int now){ if(more_one_or_two[now] != -1){ return more_one_or_two[now]; }else if(dp[now] != -1){ return dp[now]; }else if(now){ int ans = 1e9; for(int i = 1; i * (i + 1) / 2 <= now; i++){ ans = min(ans, choose(now - i * (i + 1) / 2)); } return dp[now] = ans + 1; }else{ return 0; } } int main(){ int N; cin >> N; more_one_or_two.resize(N + 1); fill(more_one_or_two.begin(), more_one_or_two.end(), -1); for(int i = 1; i * (i + 1) / 2 <= N; i++){ more_one_or_two[i * (i + 1) / 2] = 1; } for(int i = 0; i * (i + 1) / 2 <= N; i++){ for(int j = 0; i * (i + 1) / 2 + j * (j + 1) / 2 <= N; j++){ if(more_one_or_two[i * (i + 1) / 2 + j * (j + 1) / 2] == -1){ more_one_or_two[i * (i + 1) / 2 + j * (j + 1) / 2] = 2; } } } fill(dp, dp + 10000001, -1); cout << choose(N) << endl; }