제출 #1139210

#제출 시각아이디문제언어결과실행 시간메모리
1139210ndanKnapsack (NOI18_knapsack)C++20
100 / 100
65 ms7568 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll, ll> pll; #define forr(i, a, b) for (int i = (a), _b = (b); i <= _b; ++i) #define ford(i, b, a) for (int i = (b), _a = (a); i >= _a; --i) #define forf(i, a, b) for (int i = (a), _b = (b); i < _b; ++i) #define file "test" #define fi first #define se second const int maxn = 1e5 + 5; ll s, n, v[maxn], w[maxn], k[maxn]; namespace sub1 { bool check() { return n == 1; } void solve() { cout << v[1] * min(s / w[1], k[1]); } } namespace sub2 { bool check() { if (n > 100) return 0; forr(i, 1, n) if (k[i] > 1) return 0; return 1; } void solve() { ll dp[2005]; memset(dp, 0, sizeof dp); forr(i, 1, n) ford(j, s, w[i]) dp[j] = max(dp[j], dp[j - w[i]] + v[i]); cout << dp[s]; } } namespace sub34 { bool check() { if (n > 100) return 0; forr(i, 1, n) if (k[i] > 10) return 0; return 1; } void solve() { ll dp[2005]; memset(dp, 0, sizeof dp); forr(i, 1, n) ford(j, s, w[i]) forr(sl, 1, min(k[i], j / w[i])) dp[j] = max(dp[j], dp[j - w[i] * sl] + v[i] * sl); cout << dp[s]; } } namespace subfull { void solve() { ll dp[2005]; memset(dp, 0, sizeof dp); vector<pll> obj[maxn]; forr(i, 1, n) obj[w[i]].push_back({v[i], k[i]}); forr(i, 0, s) { if (obj[i].size() == 0) continue; int idx = 0; sort(obj[i].begin(), obj[i].end(), greater<pll>()); forr(sl, 1, s / i) { if (idx >= obj[i].size()) break; ford(j, s, i) dp[j] = max(dp[j], dp[j - i] + obj[i][idx].fi); obj[i][idx].se--; if (obj[i][idx].se == 0) idx++; } } cout << dp[s]; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); // freopen(file".inp", "r", stdin); // freopen(file".out", "w", stdout); cin >> s >> n; forr(i, 1, n) cin >> v[i] >> w[i] >> k[i]; if (sub1::check()) sub1::solve(); else if (sub2::check()) sub2::solve(); else if (sub34::check()) sub34::solve(); else subfull::solve(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...