Submission #723782

#TimeUsernameProblemLanguageResultExecution timeMemory
723782Yagnik_DhameliyaKnapsack (NOI18_knapsack)C++14
100 / 100
67 ms5012 KiB
#include<bits/stdc++.h>

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;


/*****************************************************************   Template Start  **************************************************************************/

#define endl                                    "\n"
#define int                                     long long
#define all(a)                                  a.begin(), a.end()
// #define sort(a)                                 sort(a.begin(), a.end())
#define sortrev(a)                              sort(a.rbegin(), a.rend())
#define prdouble(x)                             cout << fixed << setprecision(10) << x  

typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update>             ordered_set;
typedef tree<int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update>       ordered_multiset;
typedef tree<int, null_type, greater<int>, rb_tree_tag, tree_order_statistics_node_update>          ordered_greater_set;
typedef tree<int, null_type, greater_equal<int>, rb_tree_tag, tree_order_statistics_node_update>    ordered_greater_multiset;
// find_by_order()
// order_of_key()

const int INF = 0x3f3f3f3f; // 1061109567
const int M = 1e9 + 7;
const int mod =  998244353;

void print(vector<int> v) { for(int i = 0; i < v.size(); i++) { cout << v[i] << " "; } cout << endl;}

vector<int> input(int n) { vector<int> a(n); for(int i = 0; i < n; i++) cin >> a[i]; return a; }

vector<int> prime_factors(int n) { vector<int> prime; for(int i = 2; i*i <= n; i++) { while(n % i == 0) { prime.push_back(i);  n /= i; } } if(n > 1) { prime.push_back(n); } return prime; }

vector<int> divisors(int n) { vector<int> v; for(int i = 1; i*i <= n; i++) { if(n % i == 0) { v.push_back(i); if(i != n / i) { v.push_back(n / i); } } } return v; }

int gcd(int a, int b) { if(b == 0) { return a; } return gcd(b, a % b); }

int lcm(int a, int b) { return (a * b) / gcd(a, b); }

long long binMultiply(long long a, long long b, long long p) { long long ans = 0; a %= p; while(b > 0) { if(b & 1) { ans = (ans + a) % p; } a = (a + a) % p; b = b >> 1; } return ans; }

int binExp(int a, int b, int p) 
{
    if(b == 0) return 1;
    a %= p;
    if(b & 1) return (a * binExp(a, b - 1, p)) % p;
    else return binExp((a * a) % p, b >> 1, p);
}

class DSU{
    public:
    vector<int> par, rank, size;
    int n;
    DSU(int sz)
    {
        n = sz;
        rank.resize(n + 1, 0);
        size.resize(n + 1);
        par.resize(n + 1);
        for(int i = 0; i <= n; i++)
        {
            par[i] = i; 
            size[i] = 1; 
        }
    }

    int find(int node)
    {
        if(node == par[node])  return node;
        return par[node] = find(par[node]);
    }

    void merge(int u, int v)
    {
        u = find(u);
        v = find(v);
        if(u == v)  return; 
        if(size[u] < size[v])
        {
            par[u] = v;
            size[v] += size[u];
        }
        else
        {
            par[v] = u;
            size[u] += size[v];
        }
    }

    void mergeByRank(int u, int v)
    {
        u = find(u);
        v = find(v);
        if(u == v)  return; 
        if(rank[u] < rank[v]) par[u] = v;
        else if(rank[v] < rank[u]) par[v] = u; 
        else
        {
            par[v] = u;
            rank[u] += 1;
        }
    }
};

/*****************************************************************   Template End  **************************************************************************/


void solve() 
{
    int s, n;
    cin >> s >> n;
    priority_queue<pair<int, int>> pq[s + 1];
    for(int i = 0; i < n; i++)
    {
        int w, v, k;
        cin >> v >> w >> k;
        pq[w].push({v, k});
    }
    vector<int> dp(s + 1);

    for(int w = 1; w <= s; w++)
    {
        int cnt = s / w;
        while(!pq[w].empty() && cnt)
        {
            pair<int, int> p = pq[w].top();
            pq[w].pop();

            int value = p.first;
            int freq = p.second;

            freq = min(freq, cnt);
            cnt -= freq;

            for(int k = 1; k <= freq; k++)
            {
                for(int wt = s; wt >= w; wt--)
                {
                    dp[wt] = max(dp[wt], dp[wt - w] + value);
                }
            }
        }
    }
    int ans = 0;
    for(int w = 1; w <= s; w++) ans = max(ans, dp[w]);
    cout << ans << endl;

}


int32_t main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    clock_t z = clock();


    int t = 1;
    // cin >> t;

    while (t--)
    {
        solve();
    }

    cerr << "Runtime : " << ((double)(clock() - z) / CLOCKS_PER_SEC) << endl;

    return 0;
}






Compilation message (stderr)

knapsack.cpp: In function 'void print(std::vector<long long int>)':
knapsack.cpp:30:46: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   30 | void print(vector<int> v) { for(int i = 0; i < v.size(); i++) { cout << v[i] << " "; } cout << endl;}
      |                                            ~~^~~~~~~~~~
#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...