Submission #1252681

#TimeUsernameProblemLanguageResultExecution timeMemory
1252681dfscpKnapsack (NOI18_knapsack)C++20
100 / 100
39 ms1608 KiB
#include<bits/stdc++.h>
#define ll long long
#define nl '\n'
#define f0(i,a,b) for (int i = a, _b = b; i < _b; i++)
#define f1(i,a,b) for (int i = a, _b = b; i <= _b; i++)
#define rf(i,a,b) for (int i = a, _b = b; i >=_b; i--)
#define fi first
#define se second
#define file(Name) freopen(Name".inp", "r", stdin); freopen(Name".out", "w", stdout);
#define Size(a) (int)a.size()
#define bit(mask, i) ((mask>>i)&1)

using namespace std;

const int Maxn = 2e3+5;
const int mod = 1e9+7;
const int inf32 = 2e9+5;
const long long inf64 = 2e18+7;

int s, n;
vector<pair<int, int>> g[Maxn];
ll f[Maxn];

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    //freopen("test.inp", "r", stdin); freopen("hoc.out", "w", stdout);
    cin >> s >> n;
    f1(i,1,n)
    {
        int v, w, k; cin >> v >> w >> k;
        g[w].push_back({v,k});
    }
    f1(w,1,2e3)
    {
        if (!g[w].size()) continue;
        sort(g[w].begin(), g[w].end(), greater<pair<int, int>>());
        rf(i,s,1)
        {
            int cnt = 0, pos = 0, cnt_use = 0;
            ll val = 0;
            while((cnt+1)*w <= i && pos < g[w].size())
            {
                cnt++;
                val += g[w][pos].fi;
                f[i] = max(f[i], f[i-cnt*w] + val);
                cnt_use++;
                if (cnt_use == g[w][pos].se) cnt_use = 0, pos++;
            }
        }
    }
    cout << f[s];
    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...