- •Содержание
- •В ожидании Нового года Условие
- •Золотые яйца Условие
- •Отгадай слово Условие
- •Формат входного файла
- •Формат выходного файла
- •Ограничения
- •Примеры тестов
- •Инкубатор Бабы Яги Условие
- •Расписные салфеточки Условие
- •Сколько прошло дней? Условие
- •Арифметическая прогрессия Условие
- •Нарезка фантиков Условие
- •Шагающий циркуль Условие
- •Волшебные горшочки Бабы Яги Условие
- •Стиральный вопрос
- •Чудик в Цветландии Условие
- •Столовая Условие
- •Рейтинг студента Условие
- •Формат входного файла
- •Формат выходного файла
- •Ограничения
- •Примеры тестов
- •Лена и зеркало
- •Макет города Условие
- •Мосты-горки Условие
Столовая Условие
Однажды Марфа Геннадьевна пришла в столовую. В меню было 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.
