This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#include <climits>
#include <cstdint>
#include <functional>
using namespace std;
// struct item {
// int value;
// int weight;
// int amount;
// };
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int S,N;
cin >> S >> N;
// vector<item> itemTypes(N,item());
map<int,vector<pair<int,int>>> items; //indexed by weight, value first is value, value second is amount
int weight;
int value;
int amount;
for(int i=0;i<N;i++){
cin >> value >> weight >> amount;
if(weight>S||amount<=0){
continue;
}
items[weight].push_back({value,amount});
}
// for(auto pair : items){
// cout << "weight "<<pair.first<<" has: [";
// for(int i=0;i<pair.second.size();i++){
// cout << "{" << pair.second[i].first <<","<< pair.second[i].second<<"}, ";
// }
// cout << "]"<<endl;
// }
vector<vector<long long>> dp(items.size()+1,vector<long long>(S+1,INT64_MIN));
int weightIndex=1;
dp[0][0]=0;
for(auto& [weight, weightedItems] : items){
sort(weightedItems.begin(),weightedItems.end(),greater<::pair<int,int>>());
//looping thru itemTypes with weight weight
for(int i=0;i<=S;i++){
dp[weightIndex][i]=dp[weightIndex-1][i]; //pull
int totalAmount = 0;
int typeIndex = 0;
int typeAmountCount = 0;
long long totalValue = 0;
// go through as many items until we run out of items or usable weight
while ((totalAmount + 1) * weight <= i && typeIndex < weightedItems.size()) {
totalAmount++;
totalValue+=weightedItems[typeIndex].first;
if(dp[weightIndex-1][i-(totalAmount*weight)]!=INT64_MIN){
dp[weightIndex][i]=max(dp[weightIndex][i],dp[weightIndex-1][i-(totalAmount*weight)]+totalValue);
}
typeAmountCount++;
if(typeAmountCount==weightedItems[typeIndex].second){
typeAmountCount=0;
typeIndex++;
}
}
}
weightIndex++;
}
cout << *std::max_element(dp.back().begin(), dp.back().end()) << endl;
}
Compilation message (stderr)
knapsack.cpp: In function 'int main()':
knapsack.cpp:54:56: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
54 | while ((totalAmount + 1) * weight <= i && typeIndex < weightedItems.size()) {
| ~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |