fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. using ll = long long;
  4. const ll INF = 4e18;
  5.  
  6. int main() {
  7. ios::sync_with_stdio(false);
  8. cin.tie(nullptr);
  9.  
  10. int N, K;
  11. cin >> N >> K;
  12. vector<int> v(N);
  13. vector<ll> c(N);
  14. ll maxC = 0;
  15. for (int i = 0; i < N; i++) {
  16. cin >> v[i] >> c[i];
  17. maxC = max(maxC, c[i]);
  18. }
  19.  
  20. auto can = [&](ll M) -> bool {
  21. static ll dp[5001];
  22. for (int i = 0; i <= 5000; i++) dp[i] = INF;
  23. dp[0] = 0;
  24.  
  25. for (int i = 0; i < N; i++) {
  26. ll w = c[i] - (M + 1); // 핵심 수정!
  27. for (int val = 5000; val >= v[i]; val--) {
  28. if (dp[val - v[i]] != INF)
  29. dp[val] = min(dp[val], dp[val - v[i]] + w);
  30. }
  31. }
  32. for (int val = K; val <= 5000; val++) {
  33. if (dp[val] < 0) return true; // "< 0" 조건
  34. }
  35. return false;
  36. };
  37.  
  38. ll lo = 0, hi = maxC, ans = maxC;
  39. while (lo <= hi) {
  40. ll mid = (lo + hi) / 2;
  41. if (can(mid)) {
  42. ans = mid;
  43. hi = mid - 1;
  44. } else {
  45. lo = mid + 1;
  46. }
  47. }
  48. cout << ans << "\n";
  49. }
Success #stdin #stdout 0.01s 5288KB
stdin
5 10
1 1
2 2
3 3
4 4
5 5
stdout
2