Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <vector>
- #include <string>
- #include <sstream>
- #include <iostream>
- using std::cout;
- using std::string;
- using std::cin;
- using std::endl;
- using std::vector;
- using std::pair;
- int NOD(int x, int y)
- {
- return !y ? x : NOD(y, x % y);
- }
- int NOD(vector<int> xs)
- {
- if (xs.empty()) return 1;
- if (xs.size() == 1) return xs[0];
- int res = xs[0];
- for (int i = 1; i < xs.size(); i++)
- res = NOD(res, xs[i]);
- return res;
- }
- vector<int> packed(vector<int> mass, vector<int> cost, int bag_vol)
- {
- int max_mass = 0;
- for (int i = 0; i < mass.size(); i++)
- max_mass += mass[i];
- if (bag_vol < max_mass)
- max_mass = bag_vol;
- int width = max_mass + 1;
- int height = cost.size() + 1;
- vector<vector<int>> result;
- for (int i = 0; i < height; i++) {
- result.push_back(vector<int>());
- for (int j = 0; j < width; j++) {
- result[i].push_back(0);
- }
- }
- for (int i = 0; i < width; i++)
- result[0][i] = 0;
- for (int i = 0; i < height - 1; i++) {
- int c_i = cost[i];
- int m_i = mass[i];
- for (int j = 0; j < width; j++) {
- if (j >= m_i) {
- if (result[i][j] > result[i][j - m_i] + c_i)
- result[i + 1][j] = result[i][j];
- else
- result[i + 1][j] = result[i][j - m_i] + c_i;
- }
- else {
- result[i + 1][j] = result[i][j];
- }
- }
- }
- vector<int> taken;
- int left_cost = result[height - 1][width - 1];
- int left_m = max_mass;
- for (int i = height - 1; i > 0; i--) {
- if (result[i][left_m] > result[i - 1][left_m]) {
- taken.push_back(i);
- left_cost -= cost[i - 1];
- left_m -= mass[i - 1];
- }
- }
- return taken;
- }
- bool isInteger(const string s) {
- return s.find_first_not_of("0123456789") == string::npos;
- }
- void run_tests()
- {
- int t1, t2, volume;
- vector<string> words;
- string str, word;
- getline(cin, str);
- std::stringstream in(str);
- while (in >> word)
- words.push_back(word);
- volume = stoi(words[0]);
- words.clear();
- vector<int> mass;
- vector<int> cost;
- while (!cin.fail()) {
- getline(cin, str);
- std::stringstream in(str);
- while (in >> word)
- words.push_back(word);
- if (words.size() == 0)
- {
- words.clear();
- continue;
- }
- if (words.size() == 1 || words.size() > 2)
- {
- cout << "error" << endl;
- words.clear();
- continue;
- }
- if (!isInteger(words[0]) || !isInteger(words[1]))
- {
- cout << "error" << endl;
- words.clear();
- continue;
- }
- t1 = stoi(words[0]);
- t2 = stoi(words[1]);
- words.clear();
- if (t1 >= 0 && t2 >= 0)
- {
- mass.push_back(t1);
- cost.push_back(t2);
- }
- else
- cout << "error" << endl;
- }
- int nod = NOD(NOD(mass), volume);
- volume /= nod;
- for (int i = 0; i < mass.size(); i++)
- mass[i] /= nod;
- vector<int> objects = packed(mass, cost, volume);
- if (objects.empty())
- {
- cout << "0 0" << endl;
- return;
- }
- int sum_m = 0;
- int sum_c = 0;
- for (int i = 0; i < objects.size(); i++) {
- sum_m += mass[objects[i] - 1];
- sum_c += cost[objects[i] - 1];
- }
- sum_m *= nod;
- cout << sum_m << " " << sum_c << endl;
- if (objects.empty())
- {
- cout << "0 0" << endl;
- return;
- }
- for (int i = objects.size() - 1; i >= 0; i--) {
- cout << objects[i] << endl;
- }
- }
- int main()
- {
- run_tests();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement