public int minimizeTheDifference(int[][] mat, int target) {
        for (int[] ints : mat) {
            Arrays.sort(ints);
        }
        int m = mat.length;
        int n = mat[0].length;
        int max = 0;
        int min = 0;
        for (int i = 0; i < m; i++) {
            min += mat[i][0];
            max += mat[i][n - 1];
        }

        if (max <= target) {
            return target - max;
        }

        if (min >= target) {
            return min - target;
        }
        int C = 2 * target;
        int[] dp = new int[ C + 1];
        dp[0] = 1;
        for (int i = 0; i < m; i++) {
            for (int j = C; j > 0; j--) {
                dp[j] = 0;
                for (int k = 0; k < n && mat[i][k] <= j ; k++) {
                    if (dp[j - mat[i][k]] != 0) {
                        dp[j] = 1;
                    }
                }
            }
        }
        int ans = Integer.MAX_VALUE;
        for (int i = C; i > 0; i--) {
            if (dp[i] == 1) {
                ans = Math.min(ans, Math.abs(target - i));
            }
        }
        return ans;
    }