Untitled
unknown
c_cpp
4 years ago
1.5 kB
11
Indexable
#include <algorithm>
#include <iostream>
#include <numeric>
#include <vector>
std::pair<int ,int> splitInBackpacks(const std::vector<int> &items) {
using Table = std::vector<std::vector<int>>;
using Row = std::vector<int>;
Table table;
int totalWeight = std::accumulate(items.begin(), items.end(), 0);
int oneBackpackWeight = totalWeight / 2;
table.push_back(std::vector<int>(oneBackpackWeight, 0));
Row tableRow{};
for(size_t i = 0; i < items.size(); ++i) {
int weight = 0;
while(weight < items[i] - 1) {
tableRow.push_back(table[i][weight]);
weight++;
}
while(weight < oneBackpackWeight) {
int maxWeight = std::max(table[i][weight], table[i][weight - items[i]] + items[i]);
tableRow.push_back(maxWeight);
weight++;
}
table.push_back(tableRow);
tableRow.clear();
}
int result = table.back().back();
return std::minmax(result, totalWeight - result);
}
int main()
{
using std::cin;
using std::cout;
std::vector<int> items;
while(1) {
int itemsCount;
cin >> itemsCount;
if(!itemsCount)
break;
while(cin.peek() != '\n') {
int weight;
cin >> weight;
items.push_back(weight);
}
auto backpackWeights = splitInBackpacks(items);
cout << backpackWeights.second << " " << backpackWeights.first << std::endl;
items.clear();
}
return 0;
}Editor is loading...