제출 #1320626

#제출 시각아이디문제언어결과실행 시간메모리
1320626tkm_algorithmsKnapsack (NOI18_knapsack)C++20
73 / 100
1096 ms4788 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;
#define int ll
using P = pair<int, int>;
#define all(x) x.begin(), x.end()
#define rep(i, l, n) for (int i = l; i < (n); ++i)
#define sz(x) (int)x.size()
const char nl = '\n';
const int mod = 1e9+7;

struct node {
	int v, w, k;
};

void solve() {
	int s, n; cin >> s >> n;
	vector<P> g[s+2];
	vector<node> a(n);
	for (auto &i: a) {
		cin >> i.v >> i.w >> i.k;
		g[i.w].push_back(P(i.v, i.k));
	}
	
	sort(all(a), [](const node& x, const node& y) {
        if (x.v != y.v)return x.v>y.v;
        return x.w<y.w;
    });
    
    rep(i, 1, s+1)sort(g[i].rbegin(), g[i].rend());
    
    a.clear();
    rep(i, 1, s+1) {
		int cnt = 0;
		for (auto j: g[i]) {
			if (cnt>=s/i)break;
			else cnt += j.second;
			a.push_back({j.first, i, j.second});
		}
	}
	
	n = sz(a);
    
	int dp[2][s+1];
	memset(dp, 0, sizeof dp);
	
	int sum =0, now = 1;
	rep(i, 0, n) {
		sum += a[i].w*a[i].k;
		for (int j = min(s, sum); j >= 1; --j) {
			if (i>0)dp[now][j] = dp[1-now][j];
			for (int k = j-1; k >= 0; --k) {
				int mn = min((j-k)/a[i].w, a[i].k);
				dp[now][j] = max(dp[now][j], (i-1>=0?dp[1-now][k]:0ll)+mn*a[i].v);
			}
		}	
		now = 1-now;
	}
	
	int res = 0;
	rep(i, 0, s+1)res = max(res, dp[n%2][i]);
	cout << res << nl;
}

int32_t main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    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...