#include using namespace std; int main() { //入力 int N,M,K; cin >> N >> M >> K; assert(1<=N&&N<=10); assert(1<=M&&M<=10); assert(1<=K&&K<=500); vector> A(N,vector(M)); for(int i = 0; i < N; ++i) { for(int j = 0; j < M; ++j) { cin >> A[i][j]; assert(1 <= A[i][j] && A[i][j] <= 50); } for(int j = 0; j+1 < M; ++j) { assert(A[i][j] < A[i][j+1]); } } //差分計算、O(NM) int sum = 0; for(int i = 0; i < N; ++i) { int ini = A[i][0]; sum += ini; for(int j = 0; j < M; ++j) A[i][j] -= ini; } //dp、O(NMK) vector dp(K+1,0); dp[sum]=1; for(int i = 0; i < N; ++i){ vector tmp(K+1,0); for(int j = 0; j < M; ++j) { for(int k = 0; k + A[i][j] <= K; ++k) { if(dp[k]) tmp[k+A[i][j]] = 1; } } dp = tmp; } //最大値探索 O(K) for(int i = K; 0 <= i; --i) { if(dp[i]){ cout << K - i << endl; return 0; } } //ないとき cout << -1 << endl; return 0; }