classSolution { public: intclosestCost(vector<int>& baseCosts, vector<int>& toppingCosts, int target){ constint inf = 0x3f3f3f3f; int bn = baseCosts.size(), tn = toppingCosts.size(), m = 1e5; // 多重背包 bitset<100001> f; f[0] = 1; for (int i = 0; i < tn; ++i) { int v = toppingCosts[i]; for (int c = 0; c < 2; ++c) f |= f << v; } // 判断答案是否更优 // 取相对距离更小的,如果相对距离一致,取实数更小的 auto better = [&](int x, int y) -> bool { int ta = abs(x - target), tb = abs(y - target); if (ta != tb) return ta < tb; return x < y; }; // 遍历匹配 int ans = inf; for (int i = 0; i < bn; ++i) { int x = baseCosts[i]; // 如果已经 >= target, 那么自己肯定是最优的, 因为配料都大于等于1 if (x >= target) { if (better(x, ans)) ans = x; continue; } // < target的情况下, 遍历所有可能性 // 贪心优化 // 如果x + j <= target的情况下, 从target向左找到的第一个就是最优的 int gap = target - x; for (int j = gap; j >= 0; --j) { if (f[j]) { int tot = x + j; if (better(tot, ans)) { ans = tot; break; } } } // 如果x + j >= target的情况下, 从target向右找到的第一个就是最优的 for (int j = gap + 1; j <= m; ++j) { if (f[j]) { int tot = x + j; if (better(tot, ans)) { ans = tot; break; } } } } return ans; } };