|
Отправлено: 30.11.20 13:21. Заголовок: Решение задания №23 Динамическое программирование: ограничение на количество команд
Как решить другим способом? (№ 2765) Исполнитель Калькулятор преобразует число на экране. У исполнителя есть две команды, которым присвоены номера: 1. Прибавить 1 2. Прибавить 4 3. Умножить на 2 Программа для исполнителя Калькулятор – это последовательность команд. Сколько существует программ, состоящих из 7 команд, для которых при исходном числе 3 результатом является число 27? С помощью Free Pascal производим полный перебор всех возможных вариантов из ровно 7 команд. Для этого подсчитаем кол-во команд: это 3^7 = 2187 способов, т.е. цикл от 0 до 2186. С помощью программы составляем список всех команд и записываем в файл: так как 3 команды, то мы переводим числа от 0 до 2186 в троичную систему счисления и дополняем нулями до длины 7. Результаты записываем в текстовый файл. var i,a,b,c,d,e,f,g: integer; begin assign(output,'a.txt'); rewrite(output); for i:=0 to 2186 do begin g:=i mod 3; f:=i div 3 mod 3; e:=i div 3 div 3 mod 3; d:=i div 3 div 3 div 3 mod 3; c:=i div 3 div 3 div 3 div 3 mod 3; b:=i div 3 div 3 div 3 div 3 div 3 mod 3; a:=i div 3 div 3 div 3 div 3 div 3 div 3 mod 3; writeln(a,b,c,d,e,f,g) end end. Затем с помощью новой программы, считывая данные из подготовленного файла, мы проверяем каждую строчку на результат равный 27. var n,i,k,x,a,b,c,d,e,f,g:longint; begin assign(input,'a.txt'); reset(input); k:=0; for i:=0 to 2186 do begin n:=3; readln(x); a:=x div 1000000; if a=0 then n:=n+1 else if a=1 then n:=n+4 else if a=2 then n:=n*2; b:=x div 100000 mod 10; if b=0 then n:=n+1 else if b=1 then n:=n+4 else if b=2 then n:=n*2; c:=x div 10000 mod 10; if c=0 then n:=n+1 else if c=1 then n:=n+4 else if c=2 then n:=n*2; d:=x div 1000 mod 10; if d=0 then n:=n+1 else if d=1 then n:=n+4 else if d=2 then n:=n*2; e:=x div 100 mod 10; if e=0 then n:=n+1 else if e=1 then n:=n+4 else if e=2 then n:=n*2; f:=x div 10 mod 10; if f=0 then n:=n+1 else if f=1 then n:=n+4 else if f=2 then n:=n*2; g:=x mod 10; if g=0 then n:=n+1 else if g=1 then n:=n+4 else if g=2 then n:=n*2; if n=27 then begin k:=k+1;writeln(a,b,c,d,e,f,g) end end; writeln(‘Otvet’, k) end. Ответ: 37
|