Submission #1241824

#TimeUsernameProblemLanguageResultExecution timeMemory
1241824ak5028Knapsack (NOI18_knapsack)C++20
100 / 100
102 ms34696 KiB
#include<bits/stdc++.h>
using namespace std;
typedef long long  int ll;

int main(){
   ll s,n;cin>>s>>n;
   map<ll,vector<pair<ll,ll>>>diff_wts;
   for(ll i=1;i<=n;i++){
      ll v,w,k;
      cin>>v>>w>>k;
      diff_wts[w].push_back({v,k});
   }
   vector<vector<ll>>dp(diff_wts.size()+1,vector<ll>(s+1));
   dp[0][0]=0;
   ll i=1;
   for(auto &val:diff_wts){
      ll wt=val.first;
      vector<pair<ll,ll>>item_info=val.second;
      sort(item_info.begin(),item_info.end(),greater<pair<ll,ll>>());
      for(ll j=0;j<=s;j++){
         dp[i][j]=dp[i-1][j];
         ll copies=0;
         ll type_at=0;
         ll curr_used=0;
         ll profit=0;
         while(type_at < item_info.size() && j -(copies+1)*wt >=0){
               copies++;//yeh copies always increase until in while loop
               profit += item_info[type_at].first; //profit also getting increase until in while loop
               dp[i][j]=max(dp[i][j] ,dp[i-1][j -copies*wt]+profit);
               curr_used++;//to check for one type completion so that move to another type
               if(curr_used==item_info[type_at].second){
                  type_at++;//move to next type means move to next pair of item_info
                  curr_used=0;
               }
         }
      }
      i++;
   }
   //cout<<dp[diff_wts.size()][s];
   auto it=*max_element(dp.back().begin(), dp.back().end());
   cout<<it;
}
#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...