|
Лекции по структурам и алгоритмам обработки данных (СиАОД) 7Если бы по условиям задачи требовалось выявить сам набор монет, дающий минимальную стоимость, нам пришлось бы запоминать для каждого веса последнюю монетку, обеспечивающую эту стоимость. В этом случае обратный проход по убыванию чистого веса монет позволил бы восстановить нужный набор. Следующая задача динамического программирования [2] во многом похожа на рассмотренную, но имеет свои особенности. Суммы. Дано N целых чисел A1, A2, ..., AN. Требуется найти количество различных значений сумм вида k1A1 + k2A2 + ... + kNAN. Ввод из файла INPUT.TXT. В первой строке находится число N, во второй - A1, A2, ..., AN через пробел. Вывод в файл OUTPUT.TXT. Вывести одно число - количество различных значений сумм. Ограничения: 1 ≤ N ≤ 500, 0 ≤ Ai ≤ 100, 0 ≤ ki ≤ 1, все числа целые, время 2 с. Примеры
Нельзя перебрать все подмножества, их всего 2500. Максимальное значение суммы 50000. Найдем все возможные значения сумм. Заполним массив B[0..500,50000] логических значений. Положим B[L, S] = true, если можно подобрать коэффициенты k1, k2,..., kL со значениями 0 и 1 так, что k1A1+ k 2A2 +...+kLAL= S. При L=0 слагаемых нет, поэтому B[0,0]=true, B[0,S]=false при S от 1 до 50000. Найдем B[L,S] при L>0. В сумму S слагаемое AL может входить или не входить. Если слагаемое AL входит, то k1A1+ k 2A2 +...+kL-1AL-1= S - AL, если не входит, то k1A1+ k 2A2 +...+kL-1AL-1= S. Значит, сумму S с помощью L слагаемых можно получить одним из двух вариантов:
Отсюда B[L,S]=B[L-1,S] or B[L-1,S-A[L]]. На самом деле двумерный массив B не нужен, достаточно двух массивов по 50000 логических элементов для двух соседних шагов. Более того, можно обойтись одним массивом B[0..50000], заполняя его в обратном порядке.
Задачи для самостоятельного решения 4.1. Прогрессия (6) Король Камбузии с детства боится несчастливых арифметических прогрессий с разностью 13. Однажды ему представили список расходов на нужды подданных, состоящий из N чисел. Король потребовал оставить только такую начальную часть списка, в которой не скрывается несчастливая арифметическая прогрессия. Либеральная общественность, считаясь с мнением короля, настаивает, тем не менее, на сохранении как можно большей части списка. Найти максимальное значение K такое, что из первых K чисел списка невозможно выделить M чисел, следующих в порядке их нахождения в списке и образующих последовательные члены несчастливой арифметической прогрессии. Выдать члены первой обнаруженной несчастливой прогрессии. Ввод из файла INPUT.TXT. Первая строка содержит два целых положительных числа N и M, разделенных пробелом: N – количество чисел в списке, а M – недопустимое число членов прогрессии. Вторая строка содержит список расходов в виде целых положительных чисел. Ограничения: 2 ≤ N,M ≤ 5000, 1 ≤ Xi ≤ 65000, время 2 с. Вывод в файл OUTPUT.TXT. В первой строке выводится единственное число K- максимальное количество начальных чисел списка, не содержащих в качестве подсписка M последовательных членов несчастливой арифметической прогрессии. Во второй строке выводятся через пробел члены первой обнаруженной несчастливой прогрессии. Если ее не обнаружено, вывести No.
9 3 5 9 3 22 16 19 35 7 29
6 9 22 35 Пояснение: из первых 7 чисел выделяются 3 члена несчастливой прогрессии 9, 22, 35, а из первых 6 чисел можно выделить только 2 таких члена: 9, 22 либо 3, 16. 4.2. Треугольник (5) Ниже изображен пример треугольника из чисел. Найти наибольшую сумму чисел, расположенных на пути из верхней точки треугольника до основания.
7 3 8 8 1 6 4 2 3 0 Каждый шаг на пути происходит в направлении вниз по диагонали (влево или вправо). Число строк в треугольнике от 1 до 100. Треугольник составлен из целых чисел от 0 до 99. Ввод из файла INPUT.TXT. Первое число определяет количество строк треугольника N. Далее задаются строки треугольника. Вывод в файл OUTPUT.TXT. В первой строке выводится единственное число – наибольшая сумма. Во второй строке выдаются через пробел числа от вершины треугольника до основания, дающие наибольшую сумму. Если решений несколько, вывести любое из них. Пример Ввод 4 7 3 8 8 1 6 4 2 3 0 Вывод 24 7 8 6 3
Бильярдный стол расчерчен на квадратные клетки и имеет размеры MN клеток. В углах стола находятся четыре лузы для шаров. В каждой клетке (i, j), i = 1, 2,..., M; j = 1, 2,..., N задано целое число Cij. Шар ставится в центр одной из клеток и после удара может катиться в одном из четырех направлений вдоль диагоналей клетки. Если он достигает края стола, то отражается и продолжает движение, а если попадает в угол стола, то сваливается в лузу. Количество отражений не ограничено. Требуется выбрать начальную клетку для шара и направление удара так, чтобы
Если имеется несколько решений, достаточно дать любое из них. Пример движения шара показан на рисунке. р начинает движение с правой нижней клетки, проходит в результате все клетки и попадает в верхнюю правую лузу. Ввод из файла INPUT.TXT. Первая строка содержит числа M и N через пробел. Каждая i-я строка из следующих M строк содержит N чисел Cij (1 ≤ j ≤ N). Вывод в файл OUTPUT.TXT. В первой строке выводится максимальная сумма чисел. Во второй строке выводятся через пробел два числа: номера строки и столбца начальной клетки. Нумерация строк и столбцов начинается с 1. В третьей строке двумя заглавными латинскими буквами указывается направление удара:
Считается, что направление "вниз” соответствует увеличению номера строки, а "направо” - увеличению номера столбца. Ограничения: 2 ≤ M ≤ 300; 2 ≤ N ≤ 300; -1000 ≤ Cij ≤ 1000; время работы программы до 2 с.
2 3 5 -3 7 6 4 -8
22 1 1 DL
4.4. Забор (6) Фермер Питер огородил пастбище забором, состоящим из N досок. Забор имеет форму замкнутой ломаной. Некоторые из этих досок покрашены в белый цвет, а некоторые – нет. Фермер решил покрасить весь забор в белый цвет. Он обратился в компанию, и ему предложили сделать заказ. Каждый заказ формируется из множества предложений компании. Каждое предложение характеризуется количеством окрашиваемых досок Ai и стоимостью Ci, и заключается в том, что за сумму Ci сотрудники компании покрасят любые Ai идущих подряд досок. В процессе выполнения заказа разрешается доску красить сколько угодно раз, при этом уже окрашенные доски заново красить не требуется (хотя разрешается), а еще не окрашенные доски надо обязательно покрасить. Написать программу, с помощью которой можно определить, какую минимальную сумму Питер заплатит компании за то, что весь забор будет покрашен в белый цвет. Ввод. Первая строка входного файла INPUT.TXT содержит два числа: N – число досок (1 ≤ N ≤ 1000) и M – количество возможных предложений компании (1≤ M ≤ 40). Вторая строка содержит n символов, описывающих состояние покраски забора. Символ ‘+’ означает уже окрашенную доску, а символ ‘0’ – неокрашенную. Последующие m строк содержат возможные предложения компании, где каждое предложение описывается двумя натуральными числами Ai и Ci (1≤ Ai ≤ N, 1≤ Ci ≤ 106). Вывод. В файл OUTPUT.TXT вывести минимальную стоимость покраски забора. Примеры
Комментарий. В последнем примере надо воспользоваться первым предложением для раскраски первой и последней доски (забор замкнутый, поэтому они идут подряд), и дважды вторым предложением, чтобы раскрасить доски с 3 по 5 и с 9 по 11 (10-я доска уже покрашена, но она красится еще раз). |
Loading
|