赛时没有看出来,赛后回顾一下值域比较小,有容量有价值,就是一个01背包..
#include <bits/stdc++.h>
using namespace std;
#define int long long
int dp[1000010][2];
void solve() {
int n, m;
cin >> n >> m;
memset(dp, 0x3f, sizeof dp);
dp[0][0] = dp[0][1] = 0;
for (int i = 1; i <= n; i ++) {
int x, y;
cin >> x >> y;
for (int j = m; j >= 0; j --) {
dp[j][0] = min(dp[j][0], dp[max(0ll, j - x)][0] + y);
dp[j][1] = min(dp[j][1], dp[max(0ll, j - x)][1] + y);
dp[j][1] = min(dp[j][1], dp[max(0ll, j - 2 * x)][0] + y / 2);
}
}
cout << dp[m][1] << "\n";
}
signed main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int t;
t = 1;
//std::cin >> t;
while (t--) {
solve();
}
return 0;
}