This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
// oh, these hills, they burn so bright / oh, these hills, they bring me life
#include "bits/stdc++.h"
using namespace std;
using ll = long long;
#define all(x) begin(x), end(x)
#define rall(x) x.rbegin(), x.rend()
#define sz(x) (int)(x.size())
#define inf 1000000010
#define linf 0x3f3f3f3f3f3f3f3f
#define f first
#define mp make_pair
#define s second
#define pi pair<int, int>
#ifdef __INTELLISENSE__
#include "/mnt/c/yukon/pp.hpp"
#endif
#ifndef LOCAL
#define endl "\n"
#else
#include "/mnt/c/yukon/pp.hpp"
#endif
#define int ll
struct item {
int value, copies;
};
signed main() {
cin.tie(0)->sync_with_stdio(0);
int max_weight, n;
cin >> max_weight >> n;
vector<vector<item>> items(max_weight + 1);
for (int i = 0; i < n; i++) {
int v, w, c;
cin >> v >> w >> c;
items[w].push_back(item{v, c});
}
vector<vector<int>> sum_val(max_weight + 1);
for (int i = 0; i <= max_weight; i++) {
sort(all(items[i]), [](const item &a, const item &b) {
return a.value > b.value;
});
if (sz(items[i])) {
sum_val[i].push_back(items[i][0].value);
items[i][0].copies--;
for (int j = 0; j < sz(items[i]); j++) {
for (int k = 0; k < items[i][j].copies; k++) {
sum_val[i].push_back(items[i][j].value + sum_val[i].back());
if (sz(sum_val[i]) > max_weight) {
goto next;
}
}
}
next:;
}
}
vector<int> dp(max_weight + 1, -inf);
dp[0] = 0;
for (int item = 1; item <= max_weight; item++) {
if (!sz(items[item]))
continue;
for (int i = max_weight; i >= 1; i--) {
// cout << sum_val[item] << "TF " << item << endl;
for (int j = 1; i - (item * j) >= 0 && j <= sz(sum_val[item]); j++) {
dp[i] = max(dp[i], dp[i - (item * j)] + sum_val[item][j - 1]);
}
}
// if (sz(items[item])) {
// cout << "try all using item: " << item << endl;
// cout << nxt << endl;
// }
}
int ans = 0;
for (int i = 0; i <= max_weight; i++)
ans = max(ans, dp[i]);
cout << ans << endl;
}
// don't get stuck on one approach
// question bounds
// flesh out your approach before implementing o.o
// math it out
// ok well X is always possible, how about X + 1 (etc.)
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |