Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Часть сборника.doc
Скачиваний:
4
Добавлен:
01.05.2025
Размер:
488 Кб
Скачать
☆

Столовая Условие

Однажды Марфа Геннадьевна пришла в столовую. В меню было N блюд. Блюдо с номером i стоит ci рублей. Для каждого блюда известен также коэффициент сытости блюда — ai.

Марфа Геннадьевна знает, что для того, чтобы наесться, нужно, чтобы сумма коэффициентов сытости съеденных блюд была не меньше A.

Какие блюда нужно взять в столовой, чтобы наесться и потратить как можно меньше денег? Обратите внимание, что Марфа Геннадьевна может взять более одной порции блюда (любое целое неотрицательное число порций).

Формат входного файла

Входной файл содержит целые числа N A.

Далее следуют N пар целых чисел ci ai.

Формат выходного файла

Требуется вывести в выходной файл минимальную сумму денег, которую нужно потратить, чтобы наесться.

Ограничения

1 ≤ N ≤ 100

1 ≤ A ≤ 1000

1 ≤ ci ≤ 500

1 ≤ ai ≤ 100

Примеры тестов

№

Входной файл

Выходной файл

1

3 10

2 1

5 4

6 6

11

2

4 32

1 8

2 4

3 2

4 1

4

Разбор

Задача решается методом динамического программирования.

Рассмотрим однопараметрическое пространство подзадач с параметром ( — сумма коэффициентов сытости взятых блюд). Обозначим через  минимальную сумму денег, которую нужно заплатить, чтобы набрать блюд, сумма коэффициентов сытости которых равна . Если невозможно набрать блюд с такой суммой коэффициентов сытости, то  = .

Можно вывести следующую рекуррентную формулу для вычисления :

, (1)

при этом 0 = 0; если , то  = .

Тогда ответ в задаче можно найти по формуле:

. (2)

Как вычислить x по формуле (2)? Ведь в формуле (2) минимум берётся по бесконечному множеству значений! Применяя метод математической индукции, можно показать, что если , то . Отсюда следует итоговая формула для вычисления x:

.

program dining_room;

const

INFINITY = MaxInt div 2;

var

c, a: array[1..100] of integer;

sigma: array[0..1100] of integer;

n, aa: integer;

res: integer;

i, alpha: integer;

begin

assign(input, 'input.txt');

reset(input);

assign(output, 'output.txt');

rewrite(output);

read(n, aa);

read(aa);

for i := 1 to n do

read(c[i], a[i]);

sigma[0] := 0;

for alpha := 1 to aa+100 do

begin

sigma[alpha] := INFINITY;

for i := 1 to n do

begin

if (a[i] <= alpha) then

begin

if (sigma[alpha-a[i]] + c[i] < sigma[alpha]) then

sigma[alpha] := sigma[alpha-a[i]] + c[i];

end;

end;

end;

res := INFINITY;

for alpha := aa to aa+100 do

begin

if (sigma[alpha] < res) then

res := sigma[alpha];

end;

write(res);

close(input);

close(output);

end.