当时比赛时,想到的就是从上到下进行按行遍历,每一行都存储能组合的所有可能数;当在获取min值时,是直接储存了,没有最后一层查找,白白错过了Accept;
最恶心的是:dp在function里面定义就出错;我简化为2层的vector放到里面也是超时;最后还是看了其他人的题解,才把dp放到function外,结果就过了;
bool dp[71][5000];
int minimizeTheDifference(vector<vector<int> >& mat, int target) {
int m = mat.size();
int n = mat[0].size();
//第一行初始化
for (int i = 0; i < n; i++) {
dp[0][mat[0][i]] = true;
}
//计算每一行所能组合的候选集
for (int i = 1; i < m; i++) {
for (int j = 0; j < n; j++) {
for (int k = 1; k <= 4900; k++) {
if (dp[i - 1][k - mat[i][j]]) {
dp[i][mat[i][k]] = true;
}
}
}
}
//针对最后一层进行查找最小value
int min_value = INT_MAX;
for (int i = 0; i <= 4900; i++) {
//最后一行,故使用dp[m - 1][i]
if (dp[m - 1][i]) {
min_value = min(min_value, std::abs(target - i));
}
}
return min_value;
}