1. Trang chủ
  2. » Tất cả

Quay Lui.doc

4 1 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 4
Dung lượng 73 KB

Nội dung

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)

Ngày đăng: 08/02/2023, 07:30

w