Submission #726628

#TimeUsernameProblemLanguageResultExecution timeMemory
726628Azther0zKnapsack (NOI18_knapsack)C++11
100 / 100
149 ms35188 KiB
#include <bits/stdc++.h>
using namespace std;
struct ITEM
{
	int value,copy;
	bool operator<(const ITEM item)
	{
		if(value!=item.value) return value>item.value;
		return copy>item.copy;
	}
};
int main()
{
	int s,n;
	cin >> s >> n;
	map<int,vector<ITEM>> weight;
	for(int i=0;i<n;i++)
	{
		int v,w,k;
		cin >> v >> w >> k;
		weight[w].push_back({v,k});
	}
	long long result=0;
	vector<vector<long long>> dp(weight.size()+1,vector<long long>(s+1,-1));
	dp[0][0]=0;
	int at=1;
	for(auto &ww:weight)
	{
		int w=ww.first;
		vector<ITEM> item=ww.second;
		sort(item.begin(),item.end());
		for(int i=0;i<=s;i++)
		{
			dp[at][i]=dp[at-1][i];
			int copy=0,idx=0,use=0;
			long long value=0;
			while((copy+1)*w<=i&&idx<item.size())
			{
				copy++;
				value+=item[idx].value;
				if(dp[at-1][i-copy*w]!=-1)
					dp[at][i]=max(dp[at][i],dp[at-1][i-copy*w]+value);
				result=max(result,dp[at][i]);
				use++;
				if(use==item[idx].copy)
				{
					use=0;
					idx++;
				}
			}
		}
		at++;
	}
	cout << result;
}

Compilation message (stderr)

knapsack.cpp: In function 'int main()':
knapsack.cpp:37:28: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<ITEM>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   37 |    while((copy+1)*w<=i&&idx<item.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...