Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 01.03.2010, 16:46
Аватар для NIch
NIch NIch вне форума
Продвинутый
 
Регистрация: 02.06.2008
Адрес: Бендеры ПМР
Сообщения: 754
Репутация: 2446
По умолчанию

Эту задачу называют по разному...
http://ru.wikipedia.org/wiki/Задача_о_ранце
__________________
В начале был Бит, потом Байт и только потом появилось Слово...
Ответить с цитированием
  #17  
Старый 02.03.2010, 08:30
pavarotti pavarotti вне форума
Прохожий
 
Регистрация: 28.11.2009
Сообщения: 19
Репутация: -10
По умолчанию Очень близко!

Спасибо за задачу о портфеле/рюкзаке - действительно очень подходящий алгоритм решения.
Всё же несколько моментов не учитываются этим алгоритмом:
1. Он не работает с не-целыми числами. (хотя это не важно,с вои элементы я могу и округлить, границы погрешности позволяет).
2. В нём пользователь вводит сами элементы, которые нужно суммировать.
У меня же элементы уже известны, единственное что вводит пользователь это какие именно из элементов участвуют в расчете и сколько каждого.

P.S. Прилагаю программку, которую нашел по методу решения проблемы рюкзака. В ней не учтен ввод количества каждого элемента, т.е. сколько раз программа может взять один и тот же предмет для расчета одного "рецепта" получения желаемой суммы. Все остальные подобные алгоритмы найденные в интернете примерно такого же содержания.
Вложения
Тип файла: rar Ranec.rar (18.8 Кбайт, 5 просмотров)
Ответить с цитированием
  #18  
Старый 02.03.2010, 14:48
pavarotti pavarotti вне форума
Прохожий
 
Регистрация: 28.11.2009
Сообщения: 19
Репутация: -10
Сообщение

Классически задача о рюкзаке звучит так:
Из неограниченного множества предметов со свойствами „стоимость“ и „вес“, требуется отобрать некое число предметов таким образом, чтобы получить максимальную суммарную стоимость при одновременном соблюдении ограничения на суммарный вес.

По сути у меня просто несколько измененная версия "задачи о рюкзаке".
Из предметов разного веса и количества каждого типа предметов, со свойством „вес“, требуется отобрать некое число предметов таким образом, чтобы получить заранее известный суммарный вес. Т.е. наверное, можно сказать, что у каждого элемента есть два свойства "вес" и "количество".
Никак не соображу, как существующую прогу (прикреплена в предыдущем сообщении выше) можно изменить под мою задачу.
Ответить с цитированием
  #19  
Старый 03.03.2010, 16:23
pavarotti pavarotti вне форума
Прохожий
 
Регистрация: 28.11.2009
Сообщения: 19
Репутация: -10
Сообщение Может кто подскажет...

Где в этом коде вставить разграничинительный символ или еще что, чтобы полученные рецепты получения указанной суммы как-то дифференцировались друг от друга?
Например, выводил каждый найденный "рецепт" в новой строке в компоненте Memo.
Код:
procedure TForm13.Button1Click(Sender: TObject);
var a,b:array[1..100] of integer;
   n:byte;
   sum:integer;
   f:boolean;
   i,j,k,h,s,m,z:integer;
   otvet: string;
begin

  n := StrTointDef(Edit1.Text, 0);
  if n = 0 then
  begin
    ShowMessage('Не задано количество предметов');
    exit
  end;
  with StringGrid1 do
    for i := 1 to n do
      a[i] := StrTointDef(Cells[1,i], 0);
  sum := StrTointDef(Edit2.Text, 0);
  if sum = 0 then
  begin
    ShowMessage('Не задан максимальный вес предмета');
    exit
  end;
otvet := 'В ранец необходимо поместить предметы: ';
For I := N Downto 1 Do
 Begin
  B[1] := I;
  H := 1;
  K := Sum - A[i];
  F := False;
  Repeat
   For J := B[H]-1 Downto 1 Do
    Begin
     If A[J] <= K Then
      Begin
       Inc(H);
       B[H] := J;
       Dec(K, A[J]);
      End;
       If K = 0 Then
        Begin
         For M := 1 to H Do otvet := otvet + IntToStr(A[B[M]]) + '|';
         Inc(K, A[B[H]]);
         Dec(H);
        End;
    End;
   F := True;
   For M := H Downto 2 Do
     Begin
       If B[M] <> H-M+1 Then
       Begin
        F := False;
        Dec(B[M]);
    H := M;
        K := Sum;
        For Z := 1 to H Do
         Dec(K, A[B[Z]]);
        Break;
       End;
     End;
  Until F;
 End;
memo1.Lines.Add(otvet + ' ')
Admin: Учись правильно пользоваться тегами!
Изображения
Тип файла: jpg PrintScreen2.jpg (16.0 Кбайт, 5 просмотров)

Последний раз редактировалось Admin, 03.03.2010 в 22:01.
Ответить с цитированием
  #20  
Старый 04.03.2010, 13:34
pavarotti pavarotti вне форума
Прохожий
 
Регистрация: 28.11.2009
Сообщения: 19
Репутация: -10
По умолчанию Товарищи!

Ну хоть кто-нибудь подскажите с последним вопросом!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:45.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter