Научная работа

PASCAL: Задачи из школьного учебника
Сазонов Д.О.

«составить алгоритм подсчета числа способов, которыми можно уплатить k рублей купюрами достоинством в 1, 3, 5, 10, 25, 50 и 10 рублей (сами способы перечислять не требуется»

На первый взгляд вроде все просто. Но не будешь же давать задание, сам не зная решения? По сему я быстренько прикинул алгоритм на бумаге и …… застрял намертво.  Учитывая, что рекурсию и методы перебора не проходили – четкого алгоритма у меня не получилось. Мало того решение окончилось полным провалом. С помощью перестановок выдавался неправильный ответ – остается рекурсия.

{Размен монет}
uses crt;
const mon:array[0..6] of byte=(1,3,5,10,25,50,100);
      n=7;
var i:integer;
    c:array[1..7] of byte;
    coin,peres:byte;

procedure next(max,sum:integer);
var i:integer;
begin
if sum=0 then
  begin
   inc(peres);
   exit;
  end else if sum>=mon[max] then
   begin
     inc(c[max]);
     next(max,sum-mon[max]);
     dec(c[max]);
   end;
if max<>0 then next(max-1,sum);
end;

begin
clrscr;
coin:=10;
peres:=0;
next(n-1,coin);
writeln('Способов уплаты:',peres);

readln;
end.

После пары часов работы – алгоритм все таки получился. Но заинтересовало меня несколько другое: неужели данная задача предназначена для школы, причем для 10 класса?  Как можно давать такую задачу, когда целую пару иногда приходится объяснять элементарные действия с массивами?

Но в этой задаче хотя бы понятно что требуется сделать (другой вопрос как это сделать). А как вам такая задача? (учебник Гейна «основы информатики» стр. 80)

«Каждый день резидент приходит на встречу со своим агентом в случайный момент времени с 11 до 13 часов и ждет 15 мин. Агент приходит на встречу с резидентом тоже в случайный момент времени с 11 до 13 и ждет 15 минут. Сколько раз за год встретятся резидент и агент?»

{Резидент}
uses crt;

var a,r,c:integer;
    i,mid:integer;
    sum:longint;

begin
clrscr;
randomize;
sum:=0;
for mid:=1 to 2000 do
 begin
  c:=0;
for i:=1 to 365 do
 begin
   a:=random(121);
   r:=random(121);
    if (r in [a..a+15]) or
       (r+15 in [a..a+15]) then inc(c);
 end;
inc(sum,c);
end;

writeln('Агент с резидентом встретятся примерно ',sum/2000:6:2,' раз.');
readln;
end.