Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.03.2010, 19:48   #1
Sanakan
Пользователь
 
Регистрация: 03.12.2008
Сообщений: 47
По умолчанию Перебор записей в БД

Есть бд в которой хранится записи мероприятий. У каждого мероприятия есть свой приоретет и его цена. Нужно выбрать набор мероприятий с высоким приорететом и сумма которых укладывается в заданную сумму.Нужна ваша помощь. Заранее спасибо!
Sanakan вне форума Ответить с цитированием
Старый 21.03.2010, 19:51   #2
maLoy*508
Форумчанин
 
Аватар для maLoy*508
 
Регистрация: 28.03.2008
Сообщений: 672
По умолчанию

sql-запрос вам в помощь...
на форуме полно подобных тем, пользуйтесь поиском, в противном случае хотя бы укажите испльзуемую СУБД
maLoy*508 вне форума Ответить с цитированием
Старый 21.03.2010, 19:55   #3
Sanakan
Пользователь
 
Регистрация: 03.12.2008
Сообщений: 47
По умолчанию

СУБД - MS Access. SQL'ем умею пользоваться.. Вот только сам алгоритм перебора мне в голову не лезет\
Sanakan вне форума Ответить с цитированием
Старый 21.03.2010, 20:03   #4
maLoy*508
Форумчанин
 
Аватар для maLoy*508
 
Регистрация: 28.03.2008
Сообщений: 672
По умолчанию

Цитата:
Вот только сам алгоритм перебора мне в голову не лезет\
какой алгоритм??

sql-запрос будет наподобие этого...
Код:
Select ИмяТаблицы.ИмяНужногоПоля1, ИмяТаблицы.ИмяНужногоПоля2
From ИмяТаблицыИзКоторойВыбираемДанные
Where ИмяТаблицы.ИмяНужногоПоля1 = 2 {тут условие}
я думаю логика ясна
maLoy*508 вне форума Ответить с цитированием
Старый 21.03.2010, 23:33   #5
Sanakan
Пользователь
 
Регистрация: 03.12.2008
Сообщений: 47
По умолчанию

Вообщем есть 4 мероприятия:

1 - 20000 руб, Приоритет = 0.3

2 - 1000 руб, Приоритет = 0.3

3 - 1000 руб, Приоритет = 0.2

4 - 1000 руб, Приоритет = 0.2

Заданная сумма = 21000 руб

По моему алгоритму программа скажет мол оптимально 1 и 2 мероприятие, а самом деле 2,3 и 4... Т.к сумма приоритетов будет больше и сумма затрат не больше 21000 руб..
Нужно исправить... подскажите алгоритм)

Код:
procedure TMainForm.RaschetButtonClick(Sender: TObject);
var
I , J , max , Res : integer;
Buf , itog: real;
begin
if sEdit26.Text='' then 
 begin
  Res:=Application.MessageBox( 'Вы не ввели сумму !' ,
      'АИУС Гефест',MB_OK + MB_ICONERROR);
        if Res=IDOK then
          exit;
 end
   else
  begin
    SetLength(ID_Array,Dm.Mer.RecordCount);
    SetLength(Ves_Array,Dm.Mer.RecordCount);
    SetLength(Cen_Array,Dm.Mer.RecordCount);
      Dm.Mer.First;
      for I:=0 to Dm.Mer.RecordCount-1 do
        begin
          ID_Array[i]:=Dm.Mer.FieldByName('ID').AsInteger;
          Ves_Array[i]:=Dm.Mer.FieldByName('Ves').AsFloat;
          Cen_Array[i]:=Dm.Mer.FieldByName('Cen').AsFloat;
          Dm.Mer.Next;
        end;
      for i:=0 to Dm.Mer.RecordCount - 2 do
        begin
           max:=i;
           for j:=i+1 to Dm.Mer.RecordCount-1 do
            if Ves_Array[j] > Ves_Array[max] then max:=j;

             buf:=ID_Array[i];
             ID_Array[i]:=ID_Array[max];
             ID_Array[max]:=buf;

             buf:=Ves_Array[i];
             Ves_Array[i]:=Ves_Array[max];
             Ves_Array[max]:=buf;

             buf:=Cen_Array[i];
             Cen_Array[i]:=Cen_Array[max];
             Cen_Array[max]:=buf;
         end;

      sRichEdit1.Lines.Clear;
      sRichEdit1.Lines.Add('Оптимальный набор мероприятий:');
      sRichEdit1.Lines.Add('');
      buf:=0;
      itog:=0;
        for I:=0 to Dm.Mer.RecordCount-1 do
         begin
          if Cen_Array[i]<=StrToFloat(sEdit26.Text) then
           begin
             buf:=buf+Cen_Array[i];
               if buf<=StrToFloat(sEdit26.Text) then
                 begin
                    Dm.Mer.Locate('ID',ID_Array[i],[]);
                    sRichEdit1.Lines.Add('- '+Dm.Mer.FieldByName('Naz').AsString+' '+FloatToStr(Cen_Array[i])+' руб');
                    itog:=itog+Cen_Array[i];
                end;
           end;
         end;
      sRichEdit1.Lines.Add('');
      sRichEdit1.Lines.Add('Общая сумма затрат на мероприятия = '+FloatToStr(itog)+' руб');
  end;
end;

Последний раз редактировалось Sanakan; 22.03.2010 в 21:18.
Sanakan вне форума Ответить с цитированием
Старый 22.03.2010, 08:42   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
и сумма затрат не больше
у... и в сумму может входить одно мероприятие, а может два, а может 50 ?
Тогда эта задача через SQL не решается... поищите, здесь на форуме был реализован алгоритм (если не ошибаюсь (с) LeBron ), который подбирал наиболее подходящую сумму, не превосходящую заданную величину. но, поверьте мне, задачка совсем не из простых (особенно, если учитывать ещё приоритет)... ;(
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.03.2010, 08:51   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну вообще запрос может выглядеть так:
Код:
select * 
from [Мероприятия]
order by [приоритет],[цена]
а теперь проходи по записям пока общая стоимость не привысит нужную.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.03.2010, 11:15   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
а теперь проходи по записям пока общая стоимость не привысит нужную.
к сожалению, не всё так просто. Порой набор малых величин может дать более оптимальное решение.

допустим нужно набрать на сумму 10 (приоритет для простоты считаем одинаковый для всех мероприятий)
цена мероприятий:
9
7
5
2
2
2
2
2

очевидно, что 5 двоек дадут оптимальное решение...
это, как Вы понимаете, пример навскидку...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.03.2010, 12:25   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну разве что если автору нужно найоптимально...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.03.2010, 21:36   #10
Sanakan
Пользователь
 
Регистрация: 03.12.2008
Сообщений: 47
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
поищите, здесь на форуме был реализован алгоритм (если не ошибаюсь (с) LeBron )\
Спасибо, попробую поискать.. Но это еще пол беды) У мероприятий так же есть разногласия. Например, 1 мер. не может быть без 2, а если делать 3е то 1 и 2 не нужно)
Я думаю сделать список всевозможных наборов мер. которые < заданной суммы и выбрать с наивысоким приоритетом..
Sanakan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перебор значений genf Microsoft Office Excel 0 18.12.2009 10:56
Перебор результатов coirius Помощь студентам 3 12.12.2009 14:04
перебор записей BredoZavR БД в Delphi 5 29.06.2009 17:25
Перебор с памятью artemavd Общие вопросы Delphi 12 24.05.2009 06:48
перебор файлов Ralf_ru Общие вопросы Delphi 11 31.03.2009 14:23