CHUYÊN ĐỀ QUY HOẠCH ĐỘNG

4 3 0
CHUYÊN ĐỀ QUY HOẠCH ĐỘNG

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

Thông tin tài liệu

CHUYÊN ĐỀ QUY HOẠCH ĐỘNG

CHUYÊN ĐỀ QUY HOẠCH ĐỘNG I MỘT SỐ KIẾN THỨC VỀ LẬP TRÌNH ĐỘNG Phương pháp quy hoạch động Phương pháp quy hoạch động nguyên lý tối ưu nhà toán học Mỹ R.Bellman đề xuất vào năm 50 kỷ 20 Phương pháp áp dụng để giải hàng loạt toán thực tế trình kỹ thuật cộng nghệ, tổ ch ức s ản xu ất, k ế ho ạch hố kinh tế… Tuy nhiên cần lưu ý có số toán mà cách gi ải quy ho ạch đ ộng t ỏ khơng thích hợp Trong thực tế, ta thường gặp số toán tối ưu loại sau: Có m ột đại l ượng f hình thành trình gồm nhiều giai đoạn ta quan tâm đ ến k ết qu ả cu ối giá trị f phải lớn nhỏ nhất, ta gọi chung giá trị tối ưu c f Giá trị f phụ thuộc vào đại lượng xuất toán mà b ộ giá tr ị c chúng đ ược g ọi trạng thái hệ thống phụ thuộc vào cách thức đạt giá tr ị f giai đoạn mà cách tổ chức gọi điều khiển Đại lượng f thường gọi hàm mục tiêu trình đạt giá trị tối ưu f gọi trình điều khiển tối ưu Bellman phát biểu nguyên lý tối ưu (cũng gọi nguyên lý Bellman) mà ý tưởng sau: “Với trình điều khiển tối ưu, trạng thái bắt đầu A0, với trạng thái A q trình đó, phần q trình kể từ trạng thái A xem trạng thái bắt đầu tối ưu” Chú ý nguyên lý thừa nhận mà khơng chứng minh Phương pháp tìm điều khiển tối ưu theo nguyên lý Bellman thường đ ược gọi quy hoạch động Thuật ngữ nói lên thực chất q trình điều khiển động: số bước lựa chọn điều khiển tối ưu dường không tốt t ựu chung c ả q trình lại tốt Ta giải thích ý qua tốn sau: Cho dãy N số nguyên A1, A2,…,AN Hãy tìm cách xố số số hạng để dãy cịn lại đ ơn ệu hay nói cách khác ch ọn số nhiều số hạng cho dãy B gồm số hạng theo trình tự xuất dãy A đơn điệu Quá trình chọn B điều khiển qua N giai đoạn để đạt mục tiêu số lượng số hạng dãy B nhiều nhất, điều khiển giai đoạn i thể việc chọn hay không chọn Ai vào dãy B Giả sử dãy cho 10 Nếu ta chọn 1, 8, 10 chọn số hạng bỏ qua 10 ta chọn số hạng 1, 2, 4, 6, Khi giải toán cách “chia để trị” chuyển việc gi ải tốn kích th ước l ớn việc giải nhiều toán kiểu có kích thước nhỏ h ơn thu ật toán th ường đ ược thể chương trình đệ quy Khi đó, thực tế, nhiều kết trung gian phải tính nhiều lần Vậy ý tưởng quy hoạch động thật đơn giản: tránh tính tốn l ại m ọi th ứ hai lần, mà lưu giữ kết tìm kiếm vào bảng làm giả thi ết cho vi ệc tìm kiếm kết trường hợp sau Chúng ta làm đầy dần giá tr ị c b ảng b ởi k ết trường hợp trước giải Kết cuối kết qu ả c tốn cần giải Nói cách khác phương pháp quy hoạch động thể hi ện sức m ạnh c nguyên lý chia để trị đến cao độ Quy hoạch động kỹ thuật thiết kế bottom-up (từ lên) Nó đ ược b đầu v ới trường hợp nhỏ (thường đơn giải gi ải ngay) Bằng cách t ổ hợp kết có (khơng phải tính lại) trường hợp con, đạt đạt tới kết trường hợp có kích thước lớn dần lên tổng quát hơn, cuối đạt t ới l ời gi ải trường hợp tổng quát Trong số trường hợp, giải toán A, trước hết ta tìm họ tốn A(p) phụ thuộc tham số p (có thể p véc tơ) mà A(p0)=A với p0 trạng thái ban đầu tốn A Sau tìm cách giải họ toán A(p) với tham số p cách áp dụng nguyên lý tối ưu c Bellman Cuối cho p=p0 nhận kết toán A ban đầu Các bước thực quy hoạch động Chuyên đề: Quy hoạch động –THPT Cà Mau Bước 1: Lập hệ thức Dựa vào nguyên lý tối ưu tìm cách chia q trình giải tốn thành giai đo ạn, sau tìm hệ thức biểu diễn tương quan định bước xử lý v ới b ước x lý trước Hoặc tìm cách phân rã tốn thành “bài tốn con” t ương t ự có kích th ước nh ỏ hơn, tìm hệ thức nêu quan hệ kết tốn kích thước cho với kết c “bài toán con” kiểu có kích thước nhỏ nhằm xây dựng ph ương trình truy tốn (dạng hàm thủ tục đệ quy) Về cách xây dựng phương trình truy toán: Ta chia việc giải toán thành n giai đoạn M ỗi giai đo ạn i có tr ạng thái ban đ ầu t(i) chịu tác động điều khiển d(i) biến thành trạng thái ti ếp theo t(i+1) c giai đo ạn i+1 (i=1,2,…,n-1) Theo nguyên lý tối ưu Bellman việc tối ưu giai đo ạn cu ối không làm ảnh hưởng đến kết tồn tốn Với trạng thái ban đầu t(n) sau làm giai đoạn n tốt ta có trạng thái ban đầu giai đo ạn n-1 t(n-1) tác đ ộng ều ển c giai đoạn n-1 d(n-1), tiếp tục xét đến giai đoạn n-1 Sau tối ưu giai đo ạn n-1 ta l ại có t(n-2) d(n-2) lại tối ưu giai đoạn n-2 … giai đo ạn t n gi ảm đ ến tối ưu coi hồn thành tốn Gọi giá tr ị t ối ưu c tốn tính đ ến giai đo ạn k Fk giá trị tối ưu tốn tính riêng giai đoạn k Gk Fk = Fk-1 + Gk Hay là: F1 (t ( k )) = m ax {G k (t (k ), d (k )) + Fk −1 (t ( k − 1))} (*) ∀d ( k ) Bước 2: Tổ chức liệu chương trình Tổ chức liệu cho đạt yêu cầu sau:  Dữ liệu tính tốn dần theo bước  Dữ liệu lưu trữ để giảm lượng tính tốn lặp lại  Kích thước miền nhớ dành cho lưu trữ liệu nhỏ tốt, ki ểu d ữ li ệu chọn phù hợp, nên chọn đơn giản dễ truy cập Cụ thể • Các giá trị Fk thường lưu trữ bảng (mảng chiều hai, ba, v.v… chiều) • Cần lưu ý khởi trị giá trị ban đầu bảng cho thích hợp, k ết qu ả c tốn có kích cỡ nhỏ toán giải: F1 (t (1)) = m ax {G (t (1), d (1)) + F0 (t (0))} ∀d (1) • Dựa vào cơng thức, phương trình truy tốn (*) giá trị có bảng đ ể tìm dần giá trị cịn lại bảng • Ngồi cịn cần mảng lưu trữ nghiệm tương ứng với giá tr ị t ối ưu t ừng gian đoạn • Dựa vào bảng lưu trữ nghiệm bảng giá trị tối ưu t ừng giai đo ạn xây dựng, tìm kết tốn Bước 3: Làm tốt Làm tốt thuật toán cách thu gọn hệ thức (*) gi ảm kích th ước mi ền nh Thường tìm cách dùng mảng chiều thay cho mảng hai chiều n ếu giá trị m ột dòng (ho ặc cột) mảng hai chiều phụ thuộc dòng (hoặc cột) kề trước Trong số trường hợp thay mảng hai chi ều v ới giá tr ị ph ần t ch ỉ nh ận giá trị 0, mảng hai chiều cách dùng kỹ thuật quản lý bit Hạn chế quy hoạch động • Việc tìm cơng thức, phương trình truy tốn tìm cách phân rã tốn nhi ều địi hỏi phân tích tổng hợp cơng phu,dễ sai sót, khó nh ận nh th ế thích h ợp, địi hỏi nhiều thời gian suy nghĩ Đồng thời khơng phải lúc kết h ợp l ời gi ải c toán cho kết tốn lớn • Khi bảng lưu trữ địi hỏi mảng hai, ba chiều … khó xử lý liệu với kích cỡ chiều lớn hàng trăm • Có tốn khơng thể giải quy hoạch động Bồi dưỡng HSG – môn tin học, trường THPT Cà Mau II MỘT SỐ BÀI TỐN QUY HOẠCH ĐỘNG ĐIỂN HÌNH BÀI TỐN 1: Đường Cho bảng kích thước x N (1 Chuyên đề: Quy hoạch động –THPT Cà Mau begin clrscr; writeln('Ban co tao file ',tfi,' (C/K)?'); repeat ch:=readkey until upcase(ch) in ['C','K']; if upcase(ch)='K' then exit; randomize; N:=NN; assign(fi,tfi); rewrite(fi); writeln(fi,N); for i:=1 to begin for j:=1 to N write(fi,random(2)); writeln(fi); end; close(fi); end; procedure Gapdoi(var T: SoNguyen); var nho,i,tich: integer; begin nho:=0; for i:=maxS downto begin tich:=(ord(T[i])-48)*2+nho; T[i]:=chr(tich mod 10+48); nho:=tich div 10; end; end; procedure Cong(var T: SoNguyen; k: byte); begin if k=0 then exit; T[maxS]:=succ(T[maxS]); end; function Doiso(k,i: integer): integer; begin Doiso:=(k-1)*(n+1)+i+1; end; procedure Doidinh(u: integer; var k,i: integer); begin k:=(u-1) div (n+1)+1; i:=(u-1) mod (n+1); end; procedure Docdl; var i,j: integer; c: char; begin fillchar(a,sizeof(a),0); assign(fi,tfi); reset(fi); readln(fi,n); for i:=1 to begin Bồi dưỡng HSG – môn tin học, trường THPT Cà Mau for j:=1 to n begin read(fi,c); a[i,j]:=ord(c)-48; end; readln(fi); end; close(fi); zero:=''; for i:=1 to maxS zero:=zero+'0'; AmMot:=zero; AmMot[1]:=Pred(AmMot[1]); end; procedure Loang(u: integer); var v,k,i,j: integer; begin TT[u]:=-1; Doidinh(u,k,i); for j:=i+1 to n begin v:=Doiso(3k,j); if TT[v]=0 then Loang(v); end; inc(sTT); TT[u]:=sTT; CS[2*(n+1)-sTT+1]:=u; end; procedure SxTopo; var i: integer; begin Fillchar(TT,sizeof(TT),0); Fillchar(CS,sizeof(CS),0); sTT:=0; for i:=1 to 2*(n+1) if TT[i]=0 then Loang(i); end; function Ke(v,u: integer): boolean; var k,l,i,j: integer; begin Doidinh(CS[v],k,i); Doidinh(Cs[u],l,j); Ke:=(k+l=3) and (i Chuyên đề: Quy hoạch động –THPT Cà Mau T:=S[v]; if k=2 then k:=3; if l=2 then l:=3; for r:=i+1 to j Begin Gapdoi(T); Cong(T,a[k,r]); end; for r:=j downto i+1 begin GapDoi(T); Cong(T,a[2,r]); end; for r:=i+1 to j begin GapDoi(T); Cong(T,a[l,r]); end; Tong:=T; end; procedure Tinh; var i,u,v: integer; T: SoNguyen; begin fillchar(Tr,sizeof(Tr),0); i:=0; repeat inc(i) until Cs[i]=1; Tr[i]:=-1; S[i]:=zero; for u:=i+1 to 2*(n+1) begin Tr[u]:=1; S[u]:=AmMot; for v:=u-1 downto i if Ke(v,u) then begin T:=Tong(v,u); if T>S[u] then begin S[u]:=T; Tr[u]:=v; end; end; end; end; procedure TimDuong; var i,u,v,kt: integer; begin u:=Doiso(1,n); v:=Doiso(2,n); for i:=1 to 2*(n+1) Bồi dưỡng HSG – môn tin học, trường THPT Cà Mau if (Cs[i]=u) then begin Max:=S[i]; kt:=i; break; end; for i:=1 to 2*(n+1) if (cs[i]=v) then begin if Max2 then write(fo,'R'); end; close(fo); end; BEGIN {Sinhdl;} Chuyên đề: Quy hoạch động –THPT Cà Mau Docdl; SxTopo; Tinh; TimDuong; Inkq END BÀI TOÁN Cầu đá Trên đường khảo sát đoàn thám hiểm phải vượt qua cầu đá bắc qua mi ệng núi lửa Cây cầu gồm dãy phiến đá dãy Ác quỷ dãy Thiên thần Hình nêu ví dụ cầu độ dài Dãy dãy phiến đá Ác quỷ dãy dới dãy phiến đá thiên thần Hai R I N G S R dãy phiến đá có độ dài Từng cặp phiến đá Ác quỷ Thiên thần gắn với tạo thành lát, t ơng G R G G N S ứng với cột hình vẽ Trên phiến có kh ắc m ột ký tự tỏng tập {R, I, N, G, S} Hình Đồn thám hiểm phải từ bờ trái sang bờ phải Để vượt cầu, cần phải lần l ợt dẫm lên tảng theo hướng dẫn cho tr ớc dới dạng xâu ký tự Nếu sai, cầu sập xuống núi lửa phía d ới Ngồi phải bảo đảm qui tắc sau: • Các ký tự phiến đá dẫm ghi theo trình tự bước tạo thành xâu hướng dẫn • Phải bước đan xen phiến đá Ác quỷ Thiên thần bắt đ ầu t lo ại - không quan trọng • Ln tiến sang lát bên phải, độ lớn bước (số lát hai lần bước liên tiếp) khơng quan trọng Ví dụ, với cầu hình hướng dẫn 'RGS' hình 2, nêu cách vượt cầu hình nêu cách vượt cầu sai: R INGSRRINGSRGRGGNSGRGGNSRINGSRRINGSRGRGGNSGRGGNSRINGSRR I N G S R G R G G N S G R G G N S Hình Hình Yêu cầu: Cho mô tả cầu hướng dẫn Hãy xác định số cách vượt cầu Dữ liệu: Vào từ file văn BRIDGE.INP: • Dịng chứa xâu hướng dẫn • Dịng thứ chứa xâu mơ tả phiến Ác quỷ (độ dài xâu phạm vi từ đến 100) • Dịng thứ chứa xâu mô tả phiến đá Thiên thần 10 Bồi dưỡng HSG – môn tin học, trường THPT Cà Mau Kết quả: Đa file văn BRIDGE.OUT số nguyên - số lượng cách vượt Ví dụ: BRIDGE.INP BRIDGE.OUT RGS RINGSR GRGGNS CHƯƠNG TRÌNH const tfi='BRIDGE.INP'; tfo='BRIDGE.OUT'; type xaukt=string[101]; var fi, fo: text; mau: xaukt; s: array[1 2] of xaukt; M,N: integer; a: array[0 100,0 100,1 2] of integer; kq: integer; procedure Docdl; begin assign(fi,tfi); reset(fi); readln(fi,mau); readln(fi,s[1]); readln(fi,s[2]); close(fi); end; procedure XDB; var l,i,j: integer; begin m:=length(mau); n:=length(s[1]); fillchar(a,sizeof(a),0); for i:=0 to m begin a[i,0,1]:=1; a[i,0,2]:=1; end; for j:=1 to N for i:=j downto begin if s[1][j]=mau[i] then for l:=j-1 downto i-1 a[i,j,1]:=a[i,j,1]+a[i-1,l,2]; if s[2][j]=mau[i] then for l:=j-1 downto i-1 a[i,j,2]:=a[i,j,2]+a[i-1,l,2]; end; end; 11 Chuyên đề: Quy hoạch động –THPT Cà Mau procedure XLB; var i: integer; begin kq:=0; for i:=m to n kq:=kq+a[m,i,1]+a[m,i,2]; end; procedure Inkq; begin assign(fo,tfo); rewrite(fo); writeln(fo,kq); close(fo); end; BEGIN Docdl; XDB; XLB; Inkq; END BÀI TỐN Xe Bt Một xe bt cơng ty có nhiệm vụ đón nhân viên đến trụ sở làm việc Trên hành trình xe buýt tiếp nhận nhân viên đứng chờ điểm hẹn xe cịn chỗ trống Xe bt đỗ lại để chờ cơng nhân cịn chưa kịp đến điểm hẹn Cho biết thời điểm mà nhân viên đến điểm hẹn thời điểm qua điểm hẹn xe buýt Giải thiết xe buýt đến điểm hẹn thời điểm 0, thời gian xếp khách lên xe coi Hãy xác định khoảng thời gian ngắn để xe buýt chở số lượng nhân viên đến trụ sở làm việc lớn Dữ liệu vào từ file BUS.DAT: • Dịng chứa hai số nguyên dương N M theo thứ tự số ểm h ẹn s ố ch ỗ ngồi xe bt • Dịng thứ i số N dòng chứa số nguyên t i thời gian cần thiết để xe buýt di chuyển từ điểm hẹn i đến điểm hẹn i+1 (điểm hẹn thứ N+1 trụ sở làm việc công ty), số nguyên K số lượng nhân viên đến điểm hẹn i ti ếp đ ến K s ố nguyên thời điểm đến điểm hẹn K nhân viên Giới hạn: 1≤ M≤ 2000, 1≤ N≤ 200000 Kết ghi file văn BUS.OUT thời gian ngắn tìm Ví dụ: BUS.DAT BUS.OUT 35 1201 112 140234 {$r-} const fi = 'bus.da0'; fo = 'bus.ou0'; nmax = 200000; var 12 Bồi dưỡng HSG – môn tin học, trường THPT Cà Mau f : text; sl : array [0 10000] of real; n, max, t : longint; m : real; procedure open_file; begin assign(f, fi); reset(f); readln(f, n, m); {n: so diem hen, m: so cho ngoi} fillchar(sl, sizeof(sl), 0); end; function getmax(i, j : longint) : longint; begin if i > j then getmax := i else getmax := j; end; procedure solve; var ii, j, i, time, k, cs : longint; begin t := 0; max:= 0; for ii := to n begin read(f, time); {thoi gian xe di tu diem ii den diem ii+1} read(f, k); {so luong cong nhan den diem hen ii} for i := to k begin read(f, j); {thoi diem den diem hen cua cong nhan i} {gia su lui diem hen ve ben goc:} cs := getmax(0, j - t);{neu j-t Chuyên đề: Quy hoạch động –THPT Cà Mau kq : real; begin assign(f, fo); rewrite(f); kq := sl[0]; {so nguoi len xe ngay} i := 0; while (kq < m) and (i < max) begin inc(i); {i: khoang thoi gian doi, tai ben goc truoc gio xe chay} kq := kq + sl[i];{cong nhung nguoi cho o ben goc theo thu tu thoi gian tu -> max (thoi gian cho doi toi da} t := t + 1; {tang them don vi thoi gian} end; writeln(f, t); close(f); end; begin open_file; solve; print; end cách { SOLVING PROBLEM BUS } uses crt; const fi = 'BUS.da0'; fo = 'BUS.ou0'; maxM = 2000; VoCung = 1000000000; type mang1 = array[0 maxM+1]of longint; var A : mang1; M, N : integer; ThoiGian: longint; inp, out: text; function Max(a, b: longint): longint; begin if a > b then max:= a else max:= b; end; procedure Xuly(TG: longint); var i, j, t: longint; begin i:= M-1; while (i >= 0) and (A[i+1] > tg) 14 Bồi dưỡng HSG – môn tin học, trường THPT Cà Mau begin t:= Max(A[i], TG); if A[i+1] > t then A[i+1]:= t; dec(i); end; end; procedure Solve; var i, j, SL, Time : longint; begin assign(inp, fi); reset(inp); readln(inp, N, M); fillchar(A, sizeof(A), 0); for i:=1 to M a[i]:= VoCung; for i:=1 to N begin read(inp, ThoiGian); read(inp, SL); for j:=1 to SL begin read(inp, Time); Xuly(Time); end; for j:=0 to M inc(A[j], ThoiGian); end; close(inp); { In ket qua } assign(out, fo); rewrite(out); writeln(out, A[M]); close(out); end; BEGIN Solve; end BÀI TỐN Nối mạng máy tính Các học sinh đến thực tập phịng máy tính th ờng hay chơi trò chơi điện tử mạng Để ngăn ngừa, người trực phòng máy ngắt tất c ả máy tính kh ỏi m ạng x ếp chúng thành dãy bàn dài gắn chặt máy xu ống m ặt bàn r ồi đánh s ố th ứ t ự máy từ đến N theo chiều từ trái sang phải Các h ọc sinh tinh ngh ịch không ch ịu thua, h ọ định tìm cách nối máy bàn đo ạn dây n ối cho máy nối với máy khác Để tiến hành công việc này, họ đo khoảng cách hai máy liên tiếp Bạn giúp học sinh tìm cách n ối mạng tho ả mãn yêu c ầu đ ặt cho t độ dài cáp nối phải sử dụng Dữ liệu: vào từ file văn CABLE.INP: • Dịng chứa số lượng máy N (1≤ N≤ 25000) • Dịng thứ i số N-1 dòng chứa khoảng cách từ máy i đến máy i+1 (i=1,2, ,N-1) Giả thiết khoảng cách từ máy đến máy N không vượt 106 Kết quả: Ghi file văn CABLE.OUT độ dài cáp nối cần sử dụng 15 Chuyên đề: Quy hoạch động –THPT Cà Mau Ví dụ: CABLE.INP CABLE.OUT 2 2 {$A+,B-,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q+,R+,S+,T-,V+,X+} {$M 16384,0,655360} uses crt; const tfi='CABLE.INP'; tfo='CABLE.OUT'; NN=25000; type mang=array[1 13000] of LongInt; var fi,fo: text; N: integer; a: array[1 2] of ^mang; S: array[1 2] of ^mang; procedure SinhDL; var ch: char; i: integer; u: word; begin clrscr; writeln('Ban co tao file ',tfi,' (C/K)?'); repeat ch:=readkey until upcase(ch) in ['C','K']; if upcase(ch)='K' then exit; randomize; N:=NN; assign(fi,tfi); rewrite(fi); writeln(fi,N); for i:=1 to N-1 begin u:=65000; u:=random(u)+100; writeln(fi,u); end; close(fi); end; procedure CapPhat; var i: integer; 16 Bồi dưỡng HSG – môn tin học, trường THPT Cà Mau begin for i:=1 to new(a[i]); for i:=1 to new(s[i]); end; procedure DoiDinh(i: integer; var u,v: integer); begin u:=(i-1) div 13000+1; v:=(i-1) mod 13000+1; end; procedure Docdl; var i,u,v: integer; begin assign(fi,tfi); reset(fi); readln(fi,N); for i:=1 to N-1 begin DoiDinh(i,u,v); readln(fi,a[u]^[v]); end; close(fi); end; procedure XDB; var i,u,v,u1,v1,u2,v2: integer; begin s[1]^[1]:=0; s[1]^[2]:=a[1]^[1]; s[1]^[3]:=a[1]^[1]+a[1]^[2]; for i:=4 to N begin DoiDinh(i,u,v); DoiDinh(i-1,u1,v1); DoiDinh(i2,u2,v2); s[u]^[v]:=s[u1]^[v1]+a[u1]^[v1]; if s[u]^[v]>s[u2]^[v2]+a[u1]^[v1] then s[u]^[v]:=s[u2]^[v2]+a[u1]^[v1]; end; end; procedure Inkq; var u,v: integer; begin assign(fo,tfo); rewrite(fo); DoiDinh(n,u,v); writeln(fo,s[u]^[v]); close(fo); end; BEGIN CapPhat; {SinhDL;} Docdl; 17 Chuyên đề: Quy hoạch động –THPT Cà Mau XDB; Inkq; END BÀI TOÁN Chia kẹo Có N gói kẹo, gói thứ i có A[i] kẹo Yêu cầu: Hãy tìm cách chia gói kẹo thành phần cho độ chênh lệch gi ữa số kẹo hai phần Bồi dưỡng HSG – mơn tin học, trường THPT Cà Mau for i:=1 to N begin x[i]:=1; S[1]:=S[1]+a[i]; end; S[2]:=0; Delta:=S[1]; end; function Tim(i: longint): longint; var k: longint; begin for k:=1 to N if (x[k]=i) then if Delta>abs(S[i]-S[3-i]-2*a[k]) then begin Tim:=k; exit; end; Tim:=0; end; procedure Chuyen(i,k: longint); begin Delta:=abs(S[i]-S[3-i]-2*a[k]); x[k]:=3-i; S[i]:=S[i]-a[k]; S[3-i]:=S[3-i]+a[k]; end; procedure TinhDoi(var u,v: longint; var ok: boolean); var i,j: longint; begin ok:=true; for i:=1 to N if x[i]=1 then for j:=1 to N if x[j]=2 then if Delta>abs(S[1]-S[2]-2*(a[i]-a[j])) then begin u:=i; v:=j; exit; end; ok:=false; end; procedure Chia; var ok,stop: boolean; i,j,k: longint; begin KhoiDau; stop:=false; while not stop 19 Chuyên đề: Quy hoạch động –THPT Cà Mau begin stop:=true; for i:=1 to begin k:=Tim(i); if k>0 then begin Chuyen(i,k); Stop:=false; break; end; end; if stop then begin TinhDoi(i,j,ok); if ok then begin Chuyen(1,i); Chuyen(2,j); stop:=false; end; end; end; end; procedure Inkq; var i: longint; begin assign(fo,tfo); rewrite(fo); writeln(fo,S[1],' ',S[2],' ',Delta); for i:=1 to N if x[i]=1 then write(fo,i,' '); writeln(fo); for i:=1 to N if x[i]=2 then write(fo,i,' '); close(fo); end; BEGIN Docdl; Chia; Inkq; END BÀI TỐN Đồn xe qua cầu Cho đoàn xe gồm n đường chiều đoàn xe bố trí theo thứ tự từ đến n Mỗi xe đồn có vận tốc vi trọng lượng wi Khi qua cầu có trọng tải giới hạn P đồn xe phải chia thành nhóm cho tổng trọng lượng nhóm khơng q P (Lưu ý khơng đảo thứ tự đồn xe) Các nhóm phải có nghĩa nhóm thứ i khởi hành mà tồn xe nhóm thứ i - qua cầu Giả thiết P > wi với ∀i: ≤ i ≤ n Rõ ràng thời gian để nhóm xe qua cầu phụ thuộc vào xe chậm nhóm coi chiều dài khoảng cách xe không đáng kể 20 ... Cây cầu gồm d? ?y phiến đá d? ?y Ác quỷ d? ?y Thiên thần Hình nêu ví d? ?? cầu độ d? ?i D? ?y d? ?y phiến đá Ác quỷ d? ?y d? ??i d? ?y phiến đá thiên thần Hai R I N G S R d? ?y phiến đá có độ d? ?i Từng cặp phiến đá Ác... k>0 then begin Chuyen( i,k); Stop:=false; break; end; end; if stop then begin TinhDoi(i,j,ok); if ok then begin Chuyen( 1,i); Chuyen( 2,j); stop:=false; end; end; end; end; procedure Inkq; var i:... end; procedure DoiDinh(i: integer; var u,v: integer); begin u:=(i-1) div 13000+1; v:=(i-1) mod 13000+1; end; procedure Docdl; var i,u,v: integer; begin assign(fi,tfi); reset(fi); readln(fi,N);

Ngày đăng: 21/03/2023, 16:17

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan