На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
Страницы: (3) 1 2 [3]  все  ( Перейти к последнему сообщению )  
> Задача о рюкзаке
    Цитата Dr._S, 6.10.04, 09:19
    Chow, на кой х№" ты мне это объясняешь.

    Для того, что-бы было более понятно.
    Если я этим тебя (раз уж мы на ты) обидел - извини.
    Цитата Dr._S, 6.10.04, 09:19
    тогда еще проще, условие: кол-во_парашютистов = ограничение_по_кол-ву AND вес_отбираемых_парашютистов <= допустимый_вес

    Условие то понятно, но куда его поставить? Неуж-то в тот алгоритм, что ты прикреплял?
    Там, ИМХО, логика поиска не подойдет.
    Насколько я понял у тебя там в цикле берется каждый элемент по очереди и во втором цикле (внутреннем) начинает прибавляться к каждому след. Потом условие: если сума меньше заданой - то добавление продолжается, если перевалила - то прекращается, если точно равна - то комбинация запоминается.
    Все. Т.е. к-во возможных комбинаций в твоем алгоритме - N + (N-1) + (N-2) + ... 3 + 2 + 1 (т.к. внутренний цикл начин. не с 1, а с текущей позиции внешнего).
    Я же считаю (см. посты выше), что необходимое к-во комбинаций (вычисляемое по формуле Бернулли) совсем другое.
    Т.е. алгоритм не подходит по определению...

    НО! Если я не прав, и если твой алгоритм корректно заработает внесением условия
    Цитата Dr._S, 6.10.04, 09:19
    кол-во_парашютистов = ограничение_по_кол-ву AND вес_отбираемых_парашютистов <= допустимый_вес

    то я публично признаю, что я далек от комбинаторики, математики и численных методов вообще, а тебе поставлю большой жирный "+".
    Так что будь-добр, если не тяжело - внеси необходимые изменения в свой алгоритм и прикрепи его еще раз.
    Буду очень призначтелен и благодарен.
      Chow, Все понял, тут немного не подходит мой алгоритм, т.к. условия поменялись, условие ограничение_по_кол-ву его меняет. Алгоритм надо менять. Намедни посмотрю.
        Chow, посмотри своих парашютистов, только не говори, что не так.
        Файло 3,77 Кб.
          Ну вот... Что и требовалось доказать.
          Задал 30 чел., группа - 8 чел. Запустил. Пождал 20 мин. и закрыл программу так и не дождавшись результата...

          О чем я и толкую уже в этом топике давным давно - полным перебором такую задачу решить просто, но долго.
          Существует ли иной, приближенный способ решения?
          esperanto так и не высказал свою мысль по этому поводу... :(
            Вродеж уже гововрили - Генетический Алгоритм. Даст тебе приближенное решение. Собсно, он и употребим в подобных (NP) задачах.
              Chow,
              Цитата
              Ну вот... Что и требовалось доказать.
              Задал 30 чел., группа - 8 чел. Запустил. Пождал 20 мин. и закрыл программу так и не дождавшись результата...
              , у меня выполнилось за 31 сек. 1) не надо выводит на отоброжения в листе вариантов. (это тормозит) 2) Убрал Doevents(для ускорения).
              Если поубирать навороты, то будет гораздо быстрее обрабатывать.
                ребят,помогите,пожалуйста,у меня тоже зада о рюкзаке есть,но она не работает. :wall:

                Имеется рюкзак вместимостью Vmax и N предметов с весами V1,…Vn и стоимостью C1,…,Cn. Требуется унести в рюкзаке предметы на максимальную суммарную стоимость.

                program Project2;

                {$APPTYPE CONSOLE}

                uses
                SysUtils;

                type combination = array [byte] of byte;
                var x, c, v,Xmax:combination;
                m,n:byte;
                i,Vmax,Cmax:integer;

                procedure print;
                var s,i:integer;
                begin
                s:=0;
                for i:=0 to n do
                if x[i]=1 then s:=s+v[i];
                if s<Vmax then begin
                s:=0;
                for i:=0 to n do
                if x[i]=1 then s:=s +c[i];
                if s>Cmax then begin
                Cmax:=s; Xmax:=x;
                end;
                end; end;

                procedure Generate(k: integer);
                var i: integer;
                begin
                if k=N then begin
                Print;
                end else
                for i:=0 to M do begin
                x[k+1]:=i;
                Generate (k+1);
                end;
                end;

                begin
                write('n='); readln(n);
                writeln('ves='); for i:=1 to n do read(v[i]);
                writeln('st-'); for i:=1 to n do read(c[i]); readln;
                writeln('vmestimost-'); readln(Vmax);
                m:=2;
                cmax:=0;
                generate(0);

                for i:=0 to n do
                if xmax[i]=1 then write(' X=',i+1);
                readln;
                end.
                  Дьяволенок, а вы каким алгоритмом делаете?

                  Если принципом включения-невключения, то в FAQ скачайте лекции по структурам данных, там и принцип описан, и практически готовая программа на паскале.
                  FAQ: избранное часть 1 (и не последняя)

                  Если динамическим программированием, то, например, так.
                  Алгоритм решения описан в лекциях Котова по ДП
                  Сумма чисел в массиве, наиболее приближающаяся к необходимой

                  ExpandedWrap disabled
                     const N=5;
                        Ves=16;
                        var
                        M: array[1..N] of integer;
                        C: array[1..N] of integer;
                        T:array[0..N,0..Ves] of integer;
                        sum,i,j,v:integer;
                        begin
                        M[1]:= 4; M[2]:= 5; M[3]:= 3; M[4]:= 7; M[5]:= 6;
                        C[1]:= 5; C[2]:= 7; C[3]:= 4; C[4]:= 9; C[5]:= 8;
                     
                        T[0,0] := 0;
                        for j := 1 to Ves do T[0, j] := 0;
                        for i := 1 to  N do T[i, 0] := 0;
                     
                        for i := 1 to N do begin
                          for j := 1 to Ves do begin
                            if j >= M[i] then begin
                              if  T[i - 1, j]> T[i - 1, j - M[i]]+C[i] then
                                 T[i,j]:= T[i - 1, j]
                              else T[i, j]:= T[i - 1, j - M[i]]+C[i]; end
                            else T[i, j]:= T[i - 1, j];
                          end;
                        end;
                     
                        sum:= Ves; v:=0;
                     
                        for i := N downto 1 do
                          begin
                            if T[i, sum] = T[i - 1, sum] then
                               writeln (i, '---No')
                            else
                              begin writeln (i, '   ',M[i], ' ',C[i]);
                                    sum := sum - M[i];
                                    v:=v+M[i];
                              end;
                          end;
                         writeln('cost=', T[N,Ves], ' ves=',v);
                        readln;
                        end.
                  Сообщение отредактировано: Swetlana -
                    дело в том, что я ее делала не мам,так как в программирование плохо шарю)))вроде бы здесь мне сказали рекурсия используется

                    Добавлено
                    сама*
                      Цитата
                      я ее делала не мам,

                      Мама делала? Тогда маме скажите, что в общей схеме алгоритма с возвратом после вызова рекурсии для следующего k+1-го предмета нужно делать возврат, т.е. выбрасывать k-й предмет из рюкзака.
                      Модификация алгоритма с возвратом для решения задач на максимум на примере рюкзака описана в лекциях по структурам данных... :)
                        не мама а сама)))

                        Добавлено
                        спасибо за лекции)))
                          а решал кто нибудь данную задачу методом ветвей и границ?
                            JustInCase, не ты уникальный чел, и такого никто не делал :lol: тыцай сюда
                              Ещё один вариант задачи на рюкзачную тематику - а вдруг у Светланы в копилке такого нет 8-)

                              Из бесконечного потока (длинного массива) натуральных чисел в диапазоне 1..N найти (ровно) K первых чисел, сумма которых равна N.
                              Пример: N = 10, K = 3
                              3 1 7 4 2 5... = > 1 7 2
                                Такой нет, пасибки :)

                                Скрытый текст
                                Сейчас немножко не до задачек стало, со вчерашнего дня... Вот немножко тьма рассеется, и в небе солнце заалеется, и я, конечно, вернусь в Алгоритмы :)
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) 1 2 [3]  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.0861 ]   [ 14 queries used ]   [ Generated: 23.10.26, 04:56 GMT ]