ok, no to ja to widzę tak:
Kod: Zaznacz cały
program TEST;
const X=8;
type TAB=array[1..X] of integer;
var ilosc,i,szukana,n:integer;
A:TAB;
procedure szukacz(var t:TAB; j,s,liczb:integer);
begin
if (s=szukana) and (liczb=n) then ilosc:=ilosc+1
else if (s<szukana) and (j<=X) then begin
szukacz(t,j+1,s+t[j],liczb+1);
szukacz(t,j+1,s,liczb);
end;
end;
begin
ilosc:=0;
readln(szukana,n);
for i:=1 to X do readln(A[i]);
szukacz(A,1,0,0);
writeln(ilosc);
end.
program przegląda wszystkie możliwe podciągi w tablicy
A szukając takich o długości
n które sumują się do
szukana.. czy o to chodziło? bo mogłem coś źle zrozumieć.. liczbę
X (rozmiar tablicy
A) dobrałem przykładowo, żeby sprawdzić czy działa.. odpal program dla np takiego testu:
odpowiedzią powinno być:
\(\displaystyle{ 2}\) (ponieważ liczbę
\(\displaystyle{ 8}\) możemy przedstawić jako sumę podciągu o długości
\(\displaystyle{ 3}\) w tablicy
A tylko na dwa sposoby, tzn
\(\displaystyle{ 1+2+5=8 \text{ lub } 1+3+4=8}\))
choć zazwyczaj każą uważać na zienne globalne, tutaj uznałem, że będzie przejrzyście jeśli zmienne:
ilość, szukana, n będą globalne (łatwy dostęp w kazdym wywołaniu funkcji).. oczywiście zmienne:
s, j, liczb są lokalne dla każdego rekurencyjnego wywołania funkcji (z oczywistych względów..
j to zwykły iterator po tablicy,
s to aktualna suma podciągu w danym wywołaniu funkcji, a
liczb informuje nas ile jest liczb w danym analizowanym podciągu)..
jeśli masz jakieś pytania, bądź coś zrobiłem nie tak jak chcieli to wal.. jeśli tak miało być to oczywiście trochę będzie trzeba kosmetyki (
X dać jako większą stałą itp)..