func minimizeTheDifference(mat [][]int, target int) int {
dp := make([]bool, min(len(mat) * 70, target * 2) + 1)
dp[0] = true
minSum, maxSum := 0, 0
for _, row := range mat {
mi, mx := row[0], row[0]
for _, v := range row[1:] {
if v > mx {
mx = v
} else if v < mi {
mi = v
}
}
// 累加当前行最小值,便于之后计算
minSum += mi
// 获取前面所有行可以到达得最大值,且不超过 target * 2
maxSum = min(maxSum + mx, target * 2)
// 分组背包
for j := maxSum; j >= 0; j -- {
dp[j] = false
for _, v := range row {
if v <= j && dp[j - v] {
dp[j] = true
break
}
}
}
}
// 获取 ans,通过之前的所有行最小值以及其他所有的有效体积进行计算。
ans := abs(minSum - target)
for i, ok := range dp {
if ok {
ans = min(ans, abs(i - target))
}
}
return ans
}
func abs(x int) int {
if x > 0 {
return x
}
return -x
}