Problem:
Score : 300 points

Problem Statement

To make it difficult to withdraw money, a certain bank allows its customers to withdraw only one of the following amounts in one operation:

1 yen (the currency of Japan)

6 yen, 6^2(=36) yen, 6^3(=216) yen, ...

9 yen, 9^2(=81) yen, 9^3(=729) yen, ...

At least how many operations are required to withdraw exactly N yen in total?

It is not allowed to re-deposit the money you withdrew.

Constraints

1 \leq N \leq 100000

N is an integer.

Input

Input is given from Standard Input in the following format:

N

Output

If at least x operations are required to withdraw exactly N yen in total, print x.

Sample Input 1

127

Sample Output 1

4

By withdrawing 1 yen, 9 yen, 36(=6^2) yen and 81(=9^2) yen, we can withdraw 127 yen in four operations.

Sample Input 2

3

Sample Output 2

3

By withdrawing 1 yen three times, we can withdraw 3 yen in three operations.

Sample Input 3

44852

Sample Output 3

16

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <iostream>

using namespace std;

//n^rを返す
int power(int n, int r){
  int ans = 1;
  for(int i=0; i<r; i++)
    ans *= n;
  return ans;
}


int main(void){
  int N;
  cin >> N;
  //入力終わり

  //6と9の指数の最大
  int six_max  = 7;
  int nine_max = 6;

  //dp配列の初期化
  int dp[N+1];
  for(int i=0; i<=N; i++)
    dp[i] = N;
  dp[0] = 0;

  //今いる場所，次見る場所
  int now, next;
  for(now=0; now<N; now++){
    //nowから6の冪乗だけ先を見る
    for(int j=1; j<six_max; j++){
      next = now+power(6, j);
      //nextがはみ出していない
      if(next <= N)
	//nextの現状か，nowから1つ増やすかの選択
	dp[next] = min(dp[next], dp[now]+1);
    }
    //6の冪乗のときと同じ
    for(int j=1; j<nine_max; j++){
      next = now+power(9, j);
      if(next <= N)
	dp[next] = min(dp[next], dp[now]+1);
    }
    //now+1の更新
    dp[now+1] = min(dp[now+1], dp[now]+1);
  }

    cout << dp[N] << endl;
  
  return 0;
}