Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "ReadWriter.h"
- //vector, string, iostream included in "ReadWriter.h"
- using namespace std;
- //Можно добавлять любые вспомогательные методы и классы для решения задачи.
- vector<vector<int>> dinamicArray;
- /**
- * Метод, который определяет камни, которые нужно взять, по массиву для предподсчета.
- * @param i - текущая строка.
- * @param j - текущий столбец.
- * @param stones - массив камней.
- * @param res - результат (камни, которые мы взяли).
- */
- void findWay(int i, int j, int *stones, vector<int> &res) {
- if (dinamicArray[i][j] == 0)
- return;
- if (dinamicArray[i][j] != dinamicArray[i - 1][j]) {
- findWay(i - 1, j - stones[i - 1], stones, res);
- res.push_back(stones[i - 1]);
- return;
- }
- findWay(i - 1, j, stones, res);
- return;
- }
- //Задача реализовать этот метод
- //param N - количество камней
- //param W - ограничения на вес
- //param stones - массив размера N, с весами камней
- //param res - вектор результатов (вес камней, которые надо взять)
- void solve(int N, int W, int *stones, vector<int> &res) {
- //Задача решается как рюкзак только без ценности предметов (ну... у булыжников же нет особой ценности)
- //Массив для предподсчета.
- dinamicArray = vector<vector<int>>(N + 1);
- //Обнуляем левый бортик.
- for (int i = 0; i < N + 1; ++i)
- dinamicArray[i] = vector<int>(W + 1, 0);
- //Обнуляем верхний бортик.
- for (int j = 0; j < W + 1; ++j)
- dinamicArray[0][j] = 0;
- //Решаем задачу.
- for (int i = 1; i < N + 1; ++i)
- for (int j = 1; j < W + 1; ++j)
- if (j - stones[i - 1] >= 0)
- dinamicArray[i][j] = max(dinamicArray[i - 1][j],
- dinamicArray[i - 1][j - stones[i - 1]] + stones[i - 1]);
- else
- dinamicArray[i][j] = dinamicArray[i - 1][j];
- //Восстанавливаем путь.
- findWay(N, W, stones, res);
- return;
- }
- int main(int argc, const char *argv[]) {
- ReadWriter rw;
- int N = rw.readInt(); //камни
- int W = rw.readInt(); //ограничения на вес
- int *arr = new int[N]; //имеющиеся камни
- rw.readArr(arr, N);
- //основной структурой выбран вектор, так как заранее неизвестно какое количество камней будет взято
- vector<int> res;
- //решаем задачу
- solve(N, W, arr, res);
- int sum = 0;
- for (int i = 0; i < res.size(); i++)
- sum += res.at(i);
- //записываем ответ в файл
- rw.writeInt(sum); //итоговый вес
- rw.writeInt(res.size()); //количество взятых камней
- rw.writeVector(res); //сами камни
- delete[] arr;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement