제출 #976173

#제출 시각아이디문제언어결과실행 시간메모리
976173vjudge1Knapsack (NOI18_knapsack)C++17
100 / 100
45 ms3252 KiB
#include <bits/stdc++.h>
#define int long long
#define f first
#define s second
#define pb push_back
#define endl '\n'
using namespace std;

int S,N,V,W,K,dp[2005],ans;
vector<vector<pair<int, int>>> v(2005);
vector<pair<int, int>> kp;

void solve() {
	cin >> S >> N;
	dp[0] = 0;
	for (int i = 1; i <= S; i++) dp[i] = -1e9;
	for (int i = 1; i <= N; i++) {
		cin >> V >> W >> K;
		v[W].pb({V, K});
	} // instead of compress with with W and K, why not W only?
	for (int w = 1; w <= 2000; w++) {
		sort(v[w].rbegin(), v[w].rend());
		int Wmx = 2000;
		for (auto &cur : v[w]) {
			if (Wmx - w < 0) break;
			while (Wmx - w >= 0 && cur.s) {
				kp.pb({w, cur.f});
				Wmx -= w;
				cur.s--;
			}
		}
	}
	for (auto cur : kp) {
		W = cur.f;
		V = cur.s;
		// cout << W << ' ' << V << endl;
		for (int j = S; j >= W; j--) dp[j] = max(dp[j], dp[j - W] + V);
	}
	for (int i = 0; i <= S; i++) ans = max(ans, dp[i]);
	cout << ans << endl;
}

int32_t main() {
	ios_base::sync_with_stdio(0); cin.tie(0);
	int tttt = 1;
	//cin >> tttt;
	while (tttt--) solve();
}
#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...