import scala.io.StdIn.{readInt,readLine}
object Main {
    def main(args: Array[String]): Unit = {
        val input = readLine.split(" ").map(_.toInt) 
        val luggages = (1 to input(0)).foldLeft(Nil: List[Int]) { (list, v) => readInt :: list}
        println(allocation(input(1), luggages.reverse))
    }
    def allocation(k: Int, wList: List[Int]): Int = {
        /**
         * luggages : 荷物の重量のリスト
         * truck : トラックの台数
         * summary : トラック一台一台の積載量のリスト
         * curr : 現在注目しているトラックの積載量
         * min : 現時点での最小積載量(戻り値になる)
        */
        def go(luggages: List[Int], truck: Int, summary: List[Int], curr: Int, min: Int): Int = luggages match {
            case Nil => min
            // 最後の一台になったら、全てのトラックの中から積載量の最大値を取得
            // 取得した値が現時点までの最小積載量(min)よりも小さい場合は、最小積載量を更新する
            case xs if truck == 1 => (xs.sum :: summary).max match {
                case max if max < min => max
                case max => min
            }
            case x :: xs => {
                val newCurr = curr + x
                // 深さ優先で探索
                val tmpMin = go(xs, truck - 1, newCurr :: summary, 0, min)
                // 現在積載量(curr) が 現時点までの最小積載量(min) を超えてしまう場合は探索を打ち切る
                if (newCurr < min) go(xs, truck, summary, newCurr, tmpMin)
                else min
            }
        }
        go(wList, k, Nil, 0, wList.sum)
    }
}
