classSolution { public: intminimizeTheDifference(vector<vector<int>>& mat, int target){ bool f[5000]; memset(f, 0, sizeof(f)); f[0] = 1; int n = mat.size(); int m = 0; for (int i = 1; i <= n; ++i) { int mx = 0; for (int& x : mat[i - 1]) mx = max(mx, x); m += mx; for (int j = m; j >= 0; --j) { f[j] = 0; for (int k = 0; k < mat[i - 1].size(); ++k) { if (j >= mat[i - 1][k]) f[j] |= f[j - mat[i - 1][k]]; } } } int ans = 0x3f3f3f3f; for (int i = 1; i <= m; ++i) { if (f[i]) ans = min(ans, abs(i - target)); } return ans; } };
当然,直接用位运算替代会更加快:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
classSolution { public: staticconstint inf = 0x3f3f3f3f; intminimizeTheDifference(vector<vector<int>>& mat, int target){ bitset<5005> f[2]; f[0][0] = 1; for (int i = 0; i < mat.size(); ++i) { f[i + 1 & 1].reset(); for (int j = 0; j < mat[i].size(); ++j) { f[i + 1 & 1] |= f[i & 1] << mat[i][j]; } } int ans = inf; for (int i = 1; i <= 5000; ++i) { if (f[mat.size() & 1].test(i)) ans = min(ans, abs(i - target)); } return ans; } };