Submission #1322762

#TimeUsernameProblemLanguageResultExecution timeMemory
1322762hamstpanKnapsack (NOI18_knapsack)C++20
100 / 100
104 ms33032 KiB
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int pref[2010][2010], dp[2010][2010];
int main() {
	int n, s;
	cin >> s >> n;
	vector<vector<pair<int, int>>> a(s + 1);
	for (int i = 0; i < n; ++i) {
		int v, w, k;
		cin >> v >> w >> k;
		a[w].push_back({ v, k });
	}
	for (int i = 1; i <= s; ++i) sort(a[i].rbegin(), a[i].rend());
	for (int i = 1; i <= s; ++i) {
		if (a[i].empty()) continue;
		int ctr = 1, term = 0, sz = a[i].size(), rem = 1;
		while (ctr <= s && term < sz) {
			pref[i][ctr] = pref[i][ctr - 1] + a[i][term].first;
			++ctr;
			++rem;
			if (rem > a[i][term].second) {
				rem = 1;
				++term;
			}
		}
	}
	for (int i = 1; i <= s; ++i) {
		//consider putting objects of weight i
		for (int j = 1; j <= s; ++j) dp[i][j] = dp[i - 1][j];
		for (int j = 1; j <= s; ++j) {
			for (int k = 1; i * k <= j; ++k) dp[i][j] = max(dp[i][j], dp[i - 1][j - i * k] + pref[i][k]);
		}
	}
	cout << dp[s][s];
}
#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...