제출 #1164648

#제출 시각아이디문제언어결과실행 시간메모리
1164648crispxxKnapsack (NOI18_knapsack)C++20
100 / 100
45 ms3516 KiB
#include <bits/stdc++.h>

using namespace std;

#define int long long
#define all(x) x.begin(), x.end()
#define eb emplace_back
#define pb push_back
#define ar array
#define nl '\n'

void solve() {
	int S, n; cin >> S >> n;
	
	map<int, vector<ar<int, 2>>> mp;
	
	for(int i = 0; i < n; i++) {
		int v, w, k; cin >> v >> w >> k;
		mp[w].pb({v, k});
	}
	
	vector<int> dp(S + 1);
	
	for(auto [w, items] : mp) {
		sort(all(items), greater<>());
		
		vector<int> new_dp = dp;
		
		for(int i = 0; i <= S; i++) {
			int cnt = 0, idx = 0, val = 0, cur = 0;
			while((cnt + 1) * w <= i && idx < (int)items.size()) {
				cnt++;
				val += items[idx][0];
				new_dp[i] = max(new_dp[i], dp[i - cnt * w] + val);
				cur++;
				if(cur == items[idx][1]) {
					cur = 0;
					idx++;
				}
			}
		}
		
		swap(dp, new_dp);
	}
	
	cout << *max_element(all(dp)) << nl;
}

signed main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int tt = 1;
	// cin >> tt;
	while(tt--) 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...