Please help me to rezolv this prolem.
We have some arrays:
Expand|Select|Wrap|Line Numbers
- A1 1 2 3 4 5 6 14 17 23 24 27 33
- A2 7 11 13 17 19 20 25
- A3 23 25 26 27
- A4 34 45 46 47 48 49
- A5 1 5 15 17 18 23 26 29 33 34 35 36 39 46 47
.......................
.......................
A n
Another array B 2 3 4 5 23 25 33 34 44 45 46 (with maxim 15 nr. )
Combine NR. from B in n {it is necesary to be able to modificate n-ul } with condition to apear maxim z nr. {it is necesary to be able to modificate z-ul } from A1 ,maxim z nr. from A2 , A3 ETC .
Am intr-o culegere de probleme de informatica de la biblioteca codul in PASCAL dar nu chiar asa cum e problema asta.Nu stiu sa scriu conditia.
Generarea combinarilor
Fiind date 2 nr n si k sa se genereze toate combinarile de n luate cite k.
Expand|Select|Wrap|Line Numbers
- program R I4_6; {combimari de n cite k ne-recursiv}
- type vector=array[1..25] of integer;
- var st:vector; n,k:integer; {st=vectorul stiva}
- procedure initializari; {initializeaza stiva si citeste n si k}
- var I: integer;
- begin
- repeat
- write ( n=)l readln (n);
- write ( k=)l readln (k);
- until n>=k;
- for i:=1 to 25 do st[i]:=0;
- end;
- procedure tipar (p: integer) ; {tipareste o solutie memorata in vectorul st}
- var i: integer;
- begin
- for i:=1 to p do
- write (st [ i ] :4, ) ;
- writeln;
- end;
- function valid (p: integer) : boolean;
- {testeaza daca valoarea st[p] a generat o solutie valida, returnind true sau false}
- var i: integer; ok:boolean;
- begin
- {valoarea de pe nivelul p nu trebuie sa se mai gaseasca pe nici unul din nivelele anterioare 1, 2, .,p-1}
- ok:=true;
- for i:=1 to p-1 do
- if st[p]<=st[i] then
- ok:=false;
- valid:=ok;
- end;
- procedure back; {implementeaza algoritmul ne recursiv de backtracking}
- var p: integer; {virful stivei}
- begin
- p:=1; st[p]:=0; {initializam primul nivel}
- while p>0 do {cit timp stiva nu devine din nou vida}
- begin
- if st[p]<n then {daca mai exista vreo valoare neincercata pe nivelul p}
- begin
- {punem pe nivelul p urmatoarea valoare din multimea solutiilor posibile}
- st[p]:= st[p]+1;
- if valid(p) then {daca solutia (st[1],st[2], st[p]) este valida}
- if p=k then {daca solutia este si finala}
- tipar (p) {tiparim solutia}
- else
- begin
- p:=p+1; st[p]:=0; {trecem la nivelul urmator, pe care il re initializam}
- end;
- end
- else {adica pe nivelul p nu se mai poate incerca nici o valoare}
- p;=p-1; {pasul inapoi la nivelul anterior}
- end;
- end;
- begin
- initializari;
- back;
- end.
Expand|Select|Wrap|Line Numbers
- Program RI4_2 ;
- {COMBINARI DE N ELEMENTE LUATE CATE K }
- type vector=array[1..25] of integer;
- var st: vector; n,k:integer; {st=vectorul stiva}
- procedure initializari;
- var i: integer;
- begin
- for i:=1 to 25 do st[i]:=0; {initializeaza stiva}
- {citeste k si n, cu validarea conditiei n>=k}
- repeat
- write (n=); readln(n);
- write (k=); readln(k);
- until n>=k;
- end;
- procedure tipar ( p:integer) ;
- {tipareste o solutie memorata in vectorul st}
- var j:integer;
- begin
- for j:=1 to p do
- write (st[ j ]:4, );
- writeln ;
- end;
- function valid (p:integer):boolean;
- {testeaza daca valoarea pusa pe nivelul p generat o solutie valida, returnind true sau false}
- var I :integer;
- begin
- {valorile de pe stiva trebuie sa fie in ordine crescatoare, deci st[p] trebuie sa fie mai mare decit elementul st[p-1] de pe nivelul anterior}
- if (p>1) and (st[ p ]<=st[p-1]) then valid:=false
- else valid:=true;
- end;
- procedure bktr (p:integer) ; {implementeaza algoritmul de backtracking}
- var pval:integer;
- begin
- {in variabila pval trec pe rind toate valorile care ar putea fi incercate pe nivelul p}
- for pval:=1 to n do
- begin
- st[p]:=pval; {pune o noua valoare pe nivelul p}
- if valid(p) then {daca solutia obtinuta e valida}
- if p=k then {daca este si finala(o solutie finala are k nivele)}
- tipar (p) {tipareste solutia}
- else
- bktr (p+1); {trece la nivelul urmator in stiva , pt. a completa solutia}
- end;
- end;
- begin
- initilizari;
- bktr (1) ; {plecam de la nivelul 1 pe stiva}
- readln;
- end.
Thank you . The next code is corect ?? :
Expand|Select|Wrap|Line Numbers
- Dim st(100), n, k As Integer
- Private Sub CommandButton1_Click()
- initializari
- back
- End Sub
- Private Sub UserForm_Click()
- End Sub
- Sub initializari() '/{initializeaza stiva si citeste n si k}
- Do
- n = Int(InputBox("n=?"))
- k = Int(InputBox("k=?"))
- Loop Until k <= n
- For i = 1 To 25
- st(i) = 0
- Next i
- End Sub
- Sub tipar(p)
- rez = ""
- For i = 1 To p
- rez = rez + Str(st(i))
- Next i
- ListBox1.AddItem rez
- End Sub
- Function valid(p)
- ok = True
- For i = 1 To p - 1
- If st(p) <= st(i) Then ok = False
- Next i
- valid = ok
- End Function
- Sub back() ' {implementeaza algoritmul ne recursiv de backtracking}
- p = 1
- st(p) = 0
- While (p > 0)
- If st(p) < n Then
- st(p) = st(p) + 1
- If valid(p) Then
- If p = k Then
- tipar (p)
- Else
- p = p + 1
- st(p) = 0
- End If
- End If
- Else
- p = p - 1
- End If
- Wend
- End Sub