Problem:
Score : 300 points

Problem

Takahashi, who is a novice in competitive programming, wants to learn M algorithms.
Initially, his understanding level of each of the M algorithms is 0.

Takahashi is visiting a bookstore, where he finds N books on algorithms.
The i-th book (1\leq i\leq N) is sold for C_i yen (the currency of Japan). If he buys and reads it, his understanding level of the j-th algorithm will increase by A_{i,j} for each j (1\leq j\leq M).
There is no other way to increase the understanding levels of the algorithms.

Takahashi's objective is to make his understanding levels of all the M algorithms X or higher. Determine whether this objective is achievable. If it is achievable, find the minimum amount of money needed to achieve it.

Constraints

All values in input are integers.

1\leq N, M\leq 12

1\leq X\leq 10^5

1\leq C_i \leq 10^5

0\leq A_{i, j} \leq 10^5

Input

Input is given from Standard Input in the following format:

N M X
C_1 A_{1,1} A_{1,2} \cdots A_{1,M}
C_2 A_{2,1} A_{2,2} \cdots A_{2,M}
\vdots
C_N A_{N,1} A_{N,2} \cdots A_{N,M}

Output

If the objective is not achievable, print -1; otherwise, print the minimum amount of money needed to achieve it.

Sample Input 1

3 3 10
60 2 2 4
70 8 7 9
50 2 3 9

Sample Output 1

120

Buying the second and third books makes his understanding levels of all the algorithms 10 or higher, at the minimum cost possible.

Sample Input 2

3 3 10
100 3 1 4
100 1 5 9
100 2 6 5

Sample Output 2

-1

Buying all the books is still not enough to make his understanding levels of all the algorithms 10 or higher.

Sample Input 3

8 5 22
100 3 7 5 3 1
164 4 5 2 7 8
334 7 2 7 2 9
234 4 7 2 8 2
541 5 4 3 3 6
235 4 8 6 9 7
394 3 6 1 6 2
872 8 4 3 7 2

Sample Output 3

1067

Solution in OCaml (4.10.0) (judge verdict: Wrong Answer)

open Batteries
(* bitの数字の2真数の時の右からn番目の数字が0か1か *)
let is_bit_one bit n = if bit land (1 lsl n) = 0 then false else true
let bit_list bit n =
  let rec get i =
    match i with 
    | i when i = n -> []
    | _ -> if is_bit_one bit i then i :: get (i+1) else get (i+1)
  in get 0
(* 文字列をcharのlistにする *)
let explode s = List.init (String.length s) (String.get s)

let n, m, x = Scanf.sscanf (read_line()) "%d %d %d" (fun n m x -> n,m,x)

let sankousyo =
  Array.init n @@ fun a -> let k = read_line () |> String.split_on_char ' ' |> List.map int_of_string in (List.hd k, List.tl k |> Array.of_list)

let rec up_rikaido rikaido i up_rikaido_array =
  if i >= Array.length up_rikaido_array then rikaido else (rikaido.(i) <- rikaido.(i) + up_rikaido_array.(i); up_rikaido rikaido (i+1) up_rikaido_array)

let check target_sankousyo_array =
  let rec check_loop i rikaido =
    if i >= Array.length target_sankousyo_array then rikaido else
    (
      let _, up_rikaido_array = target_sankousyo_array.(i) in
      check_loop (i+1) (up_rikaido rikaido 0 up_rikaido_array)
    ) 
    in if Array.fold_left (fun a b -> if b >= x && a = true then true else false) true (check_loop 0 (Array.init m @@ fun _ -> 0)) then 
    Array.fold_left (fun a b -> let c, _ = b in a + c) 0 target_sankousyo_array else max_int

let rec get_sankousyo lst =
  Array.init (List.length lst) @@ fun a -> sankousyo.(List.nth lst a)

let rec bit_loop bit =
  if bit >= n * n then max_int else (
    (* 処理 *)
    let j = check @@ get_sankousyo @@ bit_list bit n in
    min (j) (bit_loop (bit+1))
  )

let p = bit_loop 0
let _ = Printf.printf "%d\n" @@ (if p = max_int then -1 else p)