Quy hoạch động Lớp bài toán cái túi BD HSG tin học

5 7.7K 164
Quy hoạch động  Lớp bài toán cái túi BD HSG tin học

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

Thông tin tài liệu

Tài liệu bồi dưỡng học sinh giỏi THPT – Môn Tin học Phần II: Chuyên đề nâng cao CHUYÊN ĐỀ NÂNG CAO CHUYÊN ĐỀ 6: QUY HOẠCH ĐỘNG C LỚP BÀI TOÁN CÁI TÚI Mô hình Trong siêu thị có n đồ vật (n≤1000), đồ vật thứ i có trọng lượng W[i]≤1000 giá trị V[i] ≤1000 Một tên trộm đột nhập vào siêu thị, tên trộm mang theo túi mang tối đa trọng lượng M (M≤1000) Hỏi tên trộm lấy đồ vật để tổng giá trị lớn Giải toán trường hợp sau: • Mỗi vật chọn lần • Mỗi vật chọn nhiều lần (không hạn chế số lần) InputData: file văn Bag.inp • Dòng 1: n, M cách dấu cách • n dòng tiếp theo: Mỗi dòng gồm số Wi, Vi, chi phí giá trị đồ vật thứ i OutputData: file văn bag.out: Ghi giá trị lớn tên trộm lấy Example Hướng dẫn giải Trường hợp vật chọn lần: Vali B Ta nhận thấy rằng: Giá trị túi phụ thuộc vào yếu tố: Có vật xét trọng lượng lại túi chứa được, có đại lượng biến thiên Cho nên hàm mục tiêu phụ thuộc vào hai đại lượng biến thiên Do bảng phương án bảng chiều Gọi F[i,j] tổng giá trị lớn túi xét từ vật đến vật i trọng túi chưa vượt j Với giới hạn j, việc chọn tối ưu số vật {1,2,…,i-1,i} để có giá trị lớn có hai khả năng: - Nếu không chọn vật thứ i F[i,j] giá trị lớn chọn số vật {1,2,…,i-1} với giới hạn trọng lượng j, tức là: F[i,j]:=F[i-1,j] - Nếu có chọn vật thứ i (phải thỏa điều kiện W[i] ≤ j) F[i,j] giá trị vật thứ i V[i] cộng với giá trị lớn có cách chọn số vật {1,2,…,i-1} với giới hạn trọng lượng j-W[i] tức mặt giá trị thu được: F[i,j]:=V[i]+F[i-1,j-W[i]] Vậy phải xem xét xem chọn vật i hay không chọn vật i tốt Từ có công thức truy hồi sau • F[0,j] = (hiển nhiên) – Bài toán nhỏ • F[i,j]= max(F[i-1,j], V[i]+F[i-1,j-W[i]] Trường hợp vật chọn nhiều lần: Tương tự suy luận ta xét: Vali A - Nếu không chọn vật thứ i F[i,j] giá trị lớn chọn số vật {1,2,…,i-1} với giới hạn trọng lượng j, tức là: F[i,j]:=F[i-1,j] Giáo viên: Lê Thanh Phú 1|Trang Phuleethanh@gmail.com Tài liệu bồi dưỡng học sinh giỏi THPT – Môn Tin học Phần II: Chuyên đề nâng cao - Nếu có chọn vật thứ i (phải thỏa điều kiện W[i] ≤ j) F[i,j] giá trị vật thứ i V[i] cộng với giá trị lớn có cách chọn số vật {1,2,…,i} (vì vật i chọn tiếp) với giới hạn trọng lượng j-W[i] tức mặt giá trị thu được: F[i,j]:=V[i]+F[i,j-W[i]] Do có công thức truy hồi sau: • F[0,j] = (hiển nhiên) – Bài toán nhỏ • F[i,j]= max(F[i-1,j], V[i]+F[i,j-W[i]] Bảng phương án Ta xây dựng bảng phương án dựa công thức truy hồi Để kiểm tra kết có xác hay không (nếu không xác xây dựng lại hàm mục tiêu) Thông qua cách xây dựng hàm mục tiêu bảng phương án định hướng việc truy vết Example (trường hợp vật chọn lần) Bảng phương án: Vậy chọn vật 2, 3, 4, Example (trường hợp vật chọn nhiều lần) Bảng phương án: Chúng ta chọn vật (3 lần) vật (3 lần) Truy vết Trường hợp 1: Trong bảng phương án F[n,m] giá trị lớn thu chọn n vật với giới hạn trọng lượng M Nếu f[n,M]=f[n-1,M] tức không chọn vật thứ n, ta truy f[n-1,M] Còn f[n,M]≠f[n-1,M] ta thông báo phép chọn tối ưu có chọn vật thứ n truy f[n-1,M-Wn] Giáo viên: Lê Thanh Phú 2|Trang Phuleethanh@gmail.com Tài liệu bồi dưỡng học sinh giỏi THPT – Môn Tin học Phần II: Chuyên đề nâng cao Procedure truyvet(n,m:longint); Begin if F[n,m]=0 then exit; if F[n,m]=F[n-1,m] then truyvet(n-1,m) else Begin write(n,' '); truyvet(n-1,m-w[n]); End; End; Trường hợp 2: Trong bảng phương án F[n,m] giá trị lớn thu chọn n vật với giới hạn trọng lượng M Nếu f[n,M]=f[n-1,M] tức không chọn vật thứ n, ta truy f[n-1,M] Còn f[n,M]≠f[n-1,M] ta thông báo phép chọn tối ưu có chọn vật thứ n truy f[n,M-Wn] Procedure truyvet(n,m:longint); Begin if F[n,m]=0 then exit; if F[n,m]=F[n-1,m] then truyvet(n-1,m) else Begin d:=d+1; if F[n,m-b[n]]=F[n-1,m-W[n]] then Begin inc(t); V1[t]:= n; v2[t]:= d; d:=0; end; truyvet(n,m-W[n]); End; End; Mảng v1 lưu lại số vật chọn, mảng v2 lưu lại số lượng chọn vật Sau truy vết ta có mảng lưu lại vật chọn lần Ta cần in mảng xong: For i:=t downto writeln(v1[i],#32,v2[i]); Cài đặt Bài Vali A: Procedure process; Begin for i:=1 to n for j:=1 to m if w[i]0 • L(i,t)=L(i-1,t) t ... F[n,m]=0 then exit; if F[n,m]=F[n-1,m] then truyvet(n-1,m) else Begin d:=d+1; if F[n,m-b[n]]=F[n-1,m-W[n]] then Begin inc(t); V1[t]:= n; v2[t]:= d; d:=0; end; truyvet(n,m-W[n]); End; End; Mảng v1 lưu... hạn trọng lượng M Nếu f[n,M]=f[n-1,M] tức không chọn vật thứ n, ta truy f[n-1,M] Còn f[n,M]≠f[n-1,M] ta thông báo phép chọn tối ưu có chọn vật thứ n truy f[n-1,M-Wn] Giáo viên: Lê Thanh Phú 2|Trang... hạn trọng lượng M Nếu f[n,M]=f[n-1,M] tức không chọn vật thứ n, ta truy f[n-1,M] Còn f[n,M]≠f[n-1,M] ta thông báo phép chọn tối ưu có chọn vật thứ n truy f[n,M-Wn] Procedure truyvet(n,m:longint);

Ngày đăng: 15/02/2016, 10:16

Từ khóa liên quan

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

Tài liệu liên quan