#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
const int maxN = 1e5 + 5;
const int maxS = 2e3 + 2;
const int INF = 1e9 + 9;
int v[maxN], w[maxN], k[maxN];
long long dp[maxS][maxS];
map<int, vector<pii>> m;
int S, n;
void ReadData()
{
cin >> S >> n;
for (int i = 1; i <= n; ++i)
{
cin >> v[i] >> w[i] >> k[i];
m[w[i]].push_back({v[i], k[i]});
}
}
void Solve()
{
for (int i = 0; i <= S; ++i)
for (int j = 0; j <= S; ++j)
dp[i][j] = -INF;
dp[0][0] = 0;
int t = 1;
for (auto [w, items] : m)
{
sort(items.rbegin(), items.rend());
for (int i = 0; i <= S; i++)
{
dp[t][i] = dp[t - 1][i];
int copies = 0, type_at = 0, curr_used = 0;
long long profit = 0;
while ((copies + 1) * w <= i && type_at < items.size())
{
++copies;
profit += items[type_at].first;
if (dp[t - 1][i - copies * w] != -INF) {
dp[t][i] = max(dp[t][i], dp[t - 1][i - copies * w] + profit);
}
++curr_used;
if (curr_used == items[type_at].second)
{
curr_used = 0;
type_at++;
}
}
}
t++;
}
long long ans = 0;
for (int i = 0; i <= S; ++i) ans = max(ans, dp[t - 1][i]);
cout << ans;
}
int main()
{
ReadData();
Solve();
return 0;
}
# | 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... |