object main{
  object Solver extends InputReader{
    def solve(){
      val mx = 30
      val vs = for(_ <- 1 to 4) yield getInt()

      val ans = for(
        a <- 1 to 30;
        b <- 1 to a;
        c <- 1 to b
      ) yield {
        val dp = Array.fill(mx + 1)(1000)
        dp(0) = 0

        for(
          p <- List(a, b, c);
          i <- 0 to (mx - p)
        ){
          dp(i + p) = dp(i + p) min (dp(i) + 1)
        }

        vs.map(dp(_)).sum
      }

      println(ans.min)
    }
  }

  // TEMPLATE ------------------------

  def main(args: Array[String]){
    Solver.solve()
  }

  trait InputReader{
    import java.io._
    import java.util._
    protected val stream = System.in
    private val reader = new BufferedReader(new InputStreamReader(stream))
    private var tokenizer = new StringTokenizer(reader.readLine())

    def getStr(): String = {
      while(!tokenizer.hasMoreTokens())
        tokenizer = new StringTokenizer(reader.readLine())
      tokenizer.nextToken()
    }

    def getInt(): Int = getStr().toInt
    def getLong(): Long = getStr().toLong
    def getDouble(): Double = getStr().toDouble
  }
}