ЗАДАЧИ
problems.ru
О проекте | Об авторах | Справочник
Каталог по темам | по источникам |
К задаче N

Проект МЦНМО
при участии
школы 57
Задача 76260
Тема:    [ Динамическое программирование: классические задачи ]
Сложность: 3+
Классы:
В корзину
Прислать комментарий

Условие

(Московская олимпиада по программированию) Дан неубывающий массив положительных целых чисел a[1]≤a[2]...≤a[n]. Найти наименьшее целое положительное число, не представимое в виде суммы нескольких элементов этого массива (каждый элемент массива может быть использован не более одного раза). Число действий порядка n.

Решение

Пусть известно, что числа, представимые в виде суммы элементов a[1],...,a[k], заполняют отрезок от 1 до некоторого N. Если a[k+1] > N+1, то N+1 и будет минимальным числом, не представимым в виде суммы элементов массива a[1]...a[n]. Если же a[k+1]≤N+1, то числа, представимые в виде суммы элементов a[1]...a[k+1], заполняют отрезок от 1 до N+a[k+1].

        k := 0; N := 0;
        {инвариант: числа, представимые в виде суммы элементов
         массива a[1]..a[k], заполняют отрезок 1..N}
        while (k <> n) and (a[k+1] <= N+1) do begin
        | N := N + a[k+1];
        | k := k + 1;
        end;
        {(k = n) или (a[k+1] > N+1); в обоих случаях ответ N+1}
        writeln (N+1);
(Снова тот же дефект: в условии цикла при ложном первом условии второе не определено.)

Источники и прецеденты использования

книга
Автор А.Шень
Название Программирование: теоремы и задачи
Издательство МЦНМО
Издание второе
Год издания 2004
глава
Номер 1
Название Переменные, выражения, присваивания
параграф
Номер 2
Название Массивы
задача
Номер 1.2.29

© 2004-... МЦНМО (о копирайте)
Пишите нам

Проект осуществляется при поддержке Департамента образования г.Москвы и ФЦП "Кадры" .