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;
}