Submission #1222082

#TimeUsernameProblemLanguageResultExecution timeMemory
1222082vuvietKnapsack (NOI18_knapsack)C++20
100 / 100
104 ms34492 KiB
#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 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...