За последние 24 часа нас посетили 20059 программистов и 1711 роботов. Сейчас ищут 1379 программистов ...

Помогите с алгоритмом!

Тема в разделе "Вопросы от блондинок", создана пользователем [vs], 19 май 2008.

  1. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Задача такая (несколько странная) - имеем n-е количество досок длинной 300см, под номерами. И n-е количество цифр, которые обозначают сантиметры, которые нужно напилить из досок, с минимальными отходами.
    Например, имеем 2 доски. Нужно напилить на отрезки длинной 120см, 80см, 20см, 50см, 50см, 40см. Правильнее всего первую доску распилить на 4 части (120, 80, 50, 50), а от второй отпилить куски 210 и 40.
    Пытаюсь придумать алгоритм, чтобы это делала программа... Help me plz! :)
     
  2. Johnatan

    Johnatan Активный пользователь

    С нами с:
    6 мар 2008
    Сообщения:
    508
    Симпатии:
    0
    Адрес:
    Испания
    /me думает...

    только не 210 и 40, а 20 и 40... имхо... )
     
  3. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Да, я опечатался )
    Thank!
     
  4. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    [vs]
    Перебрать комбинации просуммировав их и выбрать тот вариант, где отходов меньше всего.
     
  5. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Вот не доходит до меня, как сделать перебор комбинаций =(
     
  6. Johnatan

    Johnatan Активный пользователь

    С нами с:
    6 мар 2008
    Сообщения:
    508
    Симпатии:
    0
    Адрес:
    Испания
    Долго думалъ.. :)
    Согласен с предыдущим автором. Рекурсивно собрать сумму всех вариантов "до 300".
     
  7. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Честно говоря, до этого я тоже додумался :) Но вот как перебрать все варианты?
     
  8. sword dancer

    sword dancer Активный пользователь

    С нами с:
    17 фев 2008
    Сообщения:
    295
    Симпатии:
    0
    отсортировать длины по убыванию, для каждой длины находить первую доску больше либо равную ей и отпиливать.
     
  9. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    [vs]
    Сортируешь, после чего делаешь перебором с первого элемента сложение. Как только сумма выходит за рамки 300 - отнимаешь последний элемент и начинаешь считать вторую доску. Записываешь результат и на следующей иретации начинаешь уже со второго элемента (первый элемент уже идёт ко второй доске). И так пока подсчёт для первой доски не упрётся в поледний элемент. получишь массив вариантов из которых выбираешь самый менее отходный вариант.

    Ну а дальше можно уже думать как сделать его более эффективным и пробовать разные варианты перебора. ДУмаю стоит погуглить на предмет таких алгоритмов, кто-нить да уже придумал.