Школа программиста

Забыли пароль?
[задачи] [курсы] [олимпиады] [регистрация]
Логин:   Пароль:    
Скрыть меню
О школе
Правила
Олимпиады
Фотоальбом
Гостевая
Форум
Архив олимпиад
Архив задач
Состояние системы
Рейтинг
Курсы
Новичкам
Работа в системе
Курсы ККДП
Дистрибутивы
Статьи
Ссылки


 

Закупка носков

(Время: 1 сек. Память: 16 Мб Сложность: 43%)

Данная задача решается методом динамического программирования. Пусть c[k] – минимальная сумма денег, необходимая для покупки k пар носок. Предположим, что для заданного k нам уже известны все значения c[i] для i = 1 .. k-1. Исходя из данного предположения, определим значение c[k]. Очевидно, что для покупки k носков необходимо будет воспользоваться услугами одного из поставщиков. Поэтому рассмотрим каждого поставщика в отдельности, предполагая его вхождение в число используемых поставщиков. Допуская вхождение i-го поставщика в список используемых мы можем определить, что c[k] = c[k-a[i]]+b[i], если a[i]

Умея вычислять c[k] по предыдущим значениям, мы можем перебрать все значения k от 1 до n и вычислить c[n] – ответ на задачу. Таким образом, сложность задачи составляет O(m∙n)), что согласно ограничениям задачи позволяет уложиться в установленные временные рамки. Данный алгоритм решения может быть представлен следующим образом:

  read(n, m);
  for i=1..m read(a[i], b[i])

  for k=1..n{
    c[k]=inf
    for i=1..m
      if(a[i] < k) c[k] = min(c[k], b[i]+c[k-a[i]])
              else c[k] = min(c[k], b[i])
  }

  write(c[n])

[Обсуждение] [Все попытки] [Задача]


Красноярский краевой Дворец пионеров, (c)2006 - 2025, ИНН 246305493507, E-mail: admin@acmp.ru