Submission #874587

#TimeUsernameProblemLanguageResultExecution timeMemory
874587iag99Knapsack (NOI18_knapsack)C++17
100 / 100
132 ms37284 KiB
#include<bits/stdc++.h>
 
using namespace std;
 
typedef long long ll;

int main()
{
	int s,n;
	cin>>s>>n;
	vector<int> w(n);
	vector<ll> v(n),k(n);
	//w_i <= 2000
	//n <= 1e5
	map<int,vector<pair<int,int> > > mp;
	for(int i=0; i<n; i++)
	{
		cin>>v[i]>>w[i]>>k[i];
		if(w[i]<=s && k[i]>0) mp[w[i]].push_back(make_pair(v[i],k[i]));
	}
	vector<vector<ll> > dp(mp.size()+1, vector<ll>(s+1, INT_MIN));
	dp[0][0]=0;
	int at=1;
	/*
	 * dp[i][w]= answer after processing first i items, weight=w
	 * dp[i][w]=max(dp[i-1][w], dp[i-1][w-w[i]]+v[i])
	 * Sort each copy of an item by value, only take the greatest S/w_i copies
	 */		
	 for(auto &[w,items] : mp)
	 {
		 sort(items.begin(), items.end(), greater<pair<int,int>>());
		 for(int i=0; i<=s; i++)
		 {
			 dp[at][i]=dp[at-1][i];
			 int copies=0;
			 int type_at=0;
			 int curr_used=0;
			 ll profit=0;
			 while((copies+1)*w <= i && type_at < items.size())
			 {
				 copies++;
				 profit+=items[type_at].first;
				 if(dp[at-1][i-copies*w]!=INT_MIN)
				 {
					 dp[at][i]=max(dp[at][i], dp[at-1][i-copies*w]+profit);
				 }
				 curr_used++;
				 if(curr_used==items[type_at].second)
				 {
					 curr_used=0;
					 type_at++;
				 }
			 }
		 }
		 at++;
	 }
	 cout << *std::max_element(dp.back().begin(), dp.back().end()) << endl;

    return 0;
}

Compilation message (stderr)

knapsack.cpp: In function 'int main()':
knapsack.cpp:39:40: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   39 |     while((copies+1)*w <= i && type_at < items.size())
      |                                ~~~~~~~~^~~~~~~~~~~~~~
#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...