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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.05.2010, 18:59   #1
mailjaffka
Пользователь
 
Регистрация: 09.05.2010
Сообщений: 11
По умолчанию Жадный алгоритм и перебор

Помогите реализовать жадный алгоритм и простой перебор (либо рекурсия) для задачи:
"Есть по 2 монеты достоинств а1,а2 ... аn. Можно ли этими монетами оплатить сумму S?"
Количество номиналов, сами номиналы и сумму вводим с клавиатуры
mailjaffka вне форума Ответить с цитированием
Старый 15.05.2010, 19:11   #2
sabbathist
Пользователь
 
Регистрация: 23.07.2009
Сообщений: 66
По умолчанию

Вообще, тут жадный алгоритм не подходит. Это классическая задача на "рюкзак".
O(n)
sabbathist вне форума Ответить с цитированием
Старый 16.05.2010, 10:49   #3
mailjaffka
Пользователь
 
Регистрация: 09.05.2010
Сообщений: 11
По умолчанию

нужно реализовать 3 алгоритма для этой задачи
mailjaffka вне форума Ответить с цитированием
Старый 16.05.2010, 13:11   #4
LeBron
Форумчанин
 
Регистрация: 10.10.2009
Сообщений: 680
По умолчанию

Могу скинуть сорс для Монетки - 2 из АСМП, оптимальное алгоритмически (хотя и не самая быстрая реализация) решение для тех ограничений - полный перебор.

Жадный можно использовать только как евристику при больших ограничениях, но очень маленький шанс, что он найдет правильное решение при его наличии.

Третий алгоритм - динамика, наверно. При маленьких номиналах и большом количестве монет лучше перебора.
LeBron вне форума Ответить с цитированием
Старый 16.05.2010, 13:55   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Жадный можно использовать только как евристику
евристика - это то, что используют умные евреи?..

извините, не удержался...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.05.2010, 15:10   #6
LeBron
Форумчанин
 
Регистрация: 10.10.2009
Сообщений: 680
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
евристика - это то, что используют умные евреи?..

извините, не удержался...
Ок, эвристику Никогда не дружил с иностранными языками, как с русским, так и с английским дружу только на уровне восприятия.

На тему жадника - подумал, еще вроде учат писать "заполнение с откатом", тоесть попробовали набрать нужную сумму, если перебор - заменяем одну из монет на более мелкую, и снова пробуем...В общем, шанс срабатывания как бы больше, но и время работы тоже больше. Такой же бред, так лобовой жадник.
LeBron вне форума Ответить с цитированием
Старый 16.05.2010, 19:08   #7
mailjaffka
Пользователь
 
Регистрация: 09.05.2010
Сообщений: 11
По умолчанию

была бы очень признательна
mailjaffka вне форума Ответить с цитированием
Старый 16.05.2010, 19:10   #8
mailjaffka
Пользователь
 
Регистрация: 09.05.2010
Сообщений: 11
По умолчанию

на самом деле мне просто тремя способами нужно реализовать задачу
mailjaffka вне форума Ответить с цитированием
Старый 16.05.2010, 20:44   #9
mailjaffka
Пользователь
 
Регистрация: 09.05.2010
Сообщений: 11
По умолчанию

на самом деле мне просто тремя способами нужно реализовать задачу
mailjaffka вне форума Ответить с цитированием
Старый 16.05.2010, 22:24   #10
LeBron
Форумчанин
 
Регистрация: 10.10.2009
Сообщений: 680
По умолчанию

Код:
var input,output:text; n,i,j,g,nm,ans,t:integer;ara:array[0..1000] of integer;ar,arq:array[0..1000] of integer; ts,sum,a:integer;
begin
assign(input,'input.txt');reset(input);assign(output,'output.txt');rewrite(output);
readln(input,a,n);                                    ans:=10000;
for i:=1 to n do begin read(input,ar[i]);ts:=ts+2*ar[i];end;if ts<a then writeln(output,'-1') else begin
ara[1]:=3;for i:=2 to 15 do begin ara[i]:=3*ara[i-1];end;
for i:=1 to ara[n] do begin{ for t:=1 to n do write(arq[t]);writeln('   ',sum,' ',nm);}{sum:=0;nm:=0; }
if arq[n]<2 then begin inc(arq[n]);sum:=sum+ar[n];inc(nm);end else begin g:=n;while arq[g]>1 do begin sum:=sum-ar[g]*arq[g];dec(nm,arq[g]);
arq[g]:=0;dec(g);end;
inc(arq[g]);sum:=sum+ar[g];inc(nm);end;{for j:=1 to n do begin sum:=sum+ar[j]*arq[j];nm:=nm+arq[j];end;}if sum=a then begin
if nm<ans then ans:=nm;end;end; if ans>1000 then writeln(output,'0') else writeln(output,ans);   end;
close(output);close(input);
end.
Вот Вам полный перебор к той задаче, на которую я давал ссылку выше. Если действительно имеете общее представление о том, что такое программирование - переделаете под себя.
LeBron вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi(1й курс) Жадный алгоритм Archetype Помощь студентам 8 17.05.2010 19:49
Перебор записей в БД Sanakan Помощь студентам 9 22.03.2010 21:36
Перебор значений genf Microsoft Office Excel 0 18.12.2009 10:56
Перебор с памятью artemavd Общие вопросы Delphi 12 24.05.2009 06:48
Помошите найти не жадный DOA 4.0.7, для Delphi 6.0 Lis БД в Delphi 0 06.11.2007 15:09