HUẬT TOÁN QUAY LUI VÀ MỘT VÀI VÍ DỤ HUẬT TOÁN QUAY LUI VÀ MỘT VÀI VÍ DỤ Nguyễn Thị Trang K1 SP Tin Thuật toán quay lui dùng để giải lớp bài toán liệt kê hay bài toán tối ưu Với thuật toán này cho phép[.]
HUẬT TỐN QUAY LUI VÀ MỘT VÀI VÍ DỤ Nguyễn Thị Trang - K1 SP Tin Thuật toán quay lui dùng để giải lớp toán liệt kê hay toán tối ưu Với thuật toán cho phép giải số toán kinh điển cách dễ dàng như: Bài toán người giao hàng, toán mã tuần, toán hậu, tốn tìm đường mê cung… Thuật tốn mơ tả sau: Giả thiết cấu hình cần tìm mơ tả gồm n thành phần x 1, x2, …, xn Giả sử xác định i-1 thành phần x 1, x2, …, xi-1 ta xác định thành phần xi bằng cách duyệt tất khả đề cử cho (đánh số khả từ đến n i) Với khả j, kiểm tra xem j có chấp nhận hay không Xẩy hai trường hợp: Nếu chấp nhận j xác định xi theo j, sau i=n ta cấu hình, cịn trái lại ta tiến hành việc xác định xi+1 Nếu thử tất khả mà khơng có khả chấp nhận quay lại bước trước để xác định lại xi-1 Thuật tốn quay lui mô tả đoạn mã giả lệnh sau: {Thủ tục thử cho xi nhận giá trị mà nhận} Procedure Try(i); For (mọi khả năngj có thể gán cho xi) do If then Begin If i=n then Else Try(i+1); End (Thuật tốn quay lui bắt đầu lời gọi Try(1);) Ta trình bày q trình tìm kiếm lời giải thuật tốn quay lui sau: Ví dụ Liệt kê xâu nhị phân có độ dài n khơng chứa hai số liên tiếp Chương trình sau viết môi trường Borland Pascal uses wincrt; Var a:array[1 100] of 1; n, dem,k:integer; Procedure inxau ; var i:integer; begin dem:=dem+1; for i:=1 to n do write(a[i]); writeln; end; Procedure try(i:integer); var j, k: integer;b: boolean; begin for j:=0 to begin if (i>1) and (a[i-1]=0) and (j=0) then continue; a[i]:=j; if (i=n)then inxau else try(i+1); end; end; BEGIN write('Nhap n='); readln(n); dem:=0; try(1); writeln('so xau thoa man:', dem); readln; END Ví dụ 2. Liệt kê tất phần tử D= Trong a1, a2, …, an, b số nguyên dương Program Liet_ke; Uses wincrt; Var A:Array[1 100] of byte; X:Array[1 100] of 1; B, Dem:Word; N:Byte; { Doc du lieu tu tep } Procedure Init; Var F:Text; I:Byte; BEGIN Assign(F,'LIETKE.INP'); Reset(F); Readln(F,N); For I:=1 to N Read(F,A[I]); Readln(F,B); Close(F); Dem:=0; END; { In day } Procedure In_day(K:Byte); Var I:Byte; BEGIN Dem:=Dem+1; Write(Dem:4,': '); For I:=1 to K Write(X[I]:2); For I:=K+1 to N Write(0:2); Writeln; END; { Ham tinh tong} Function Tong(K:Byte):Word; Var I:Byte; S:Word; Begin S:=0; For I:=1 to K S:=S+A[I]*X[I]; Tong:=S; End; { Quay lui } Procedure Try(I:Byte); Var S:Word; J:0 1; Begin S:=Tong(I-1); For J:=0 to Begin X[I]:=J; If Tong(I)=B then In_day(I) Else If (TONG(I)