1. Trang chủ
  2. » Công Nghệ Thông Tin

Bai toan cai tui Quy hoach dong

5 32 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 5
Dung lượng 387,98 KB

Nội dung

Ta nhận thấy rằng: Giá trị của cái túi phụ thuộc vào 2 yếu tố: Có bao nhiêu vật đang được xét và trọng lượng còn lại cái túi có thể chứa được, do vậy chúng ta có 2 đại lượng biến thiên.[r]

(1)

http://quyhoachdong.jimdo.com/ Page 17 BÀI 1: LỚP BÀI TOÁN CÁI TÚI

I TỔNG QUAN 1 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

Input Output

5 15 12 2 1 10

15

2 Hướng dẫn giải

Trường hợp vật chọn lần

(2)

http://quyhoachdong.jimdo.com/ Page 18 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] = 0 (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:

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} (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] = 0 (hiển nhiên) – Bài toán nhỏ  F[i,j]= max(F[i-1,j], V[i]+F[i,j-W[i]]

3 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)

Input Output

5 15 12 2 1 10

(3)

http://quyhoachdong.jimdo.com/ Page 19 Bảng phương án:

N/M 5 6 7 8 9 10 11 12 13 14 15

0 0 0 0 0 0 0 0 0

1 0 0 0 0 0 0 4 4

2 0 2 2 2 2 2 4 6

3 3 3 3 3 3

4 5 5 5 5 5

5 10 12 13 14 15 15 15 15 15 15 15 15 Vậy chọn vật 2, 3, 4,

Example (trường hợp vật chọn nhiều lần)

Input Output

5 15 12 2 1 10

36

Bảng phương án:

N/M 5 6 7 8 9 10 11 12 13 14 15

0 0 0 0 0 0 0 0 0

1 0 0 0 0 0 0 4 4

2 0 2 4 6 8 10 10 12 12 14 14

3 10 11 12 13 14 15

4 10 12 14 16 18 20 22 24 26 28 30

5 10 12 14 16 20 22 24 26 30 32 34 36

Chúng ta chọn vật (3 lần) vật (3 lần) 4 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

(4)

http://quyhoachdong.jimdo.com/ Page 20 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]

5 Cài đặt

Program Bag; Const

limit = 1000; Var

V,W: Array[1 limit] of integer; F: Array[0 limit,0 limit] of integer; n,M,i,j: integer; fi,fo: text; { -} Procedure inputdata; Begin assign(fi,'bag.inp'); reset(fi); readln(fi,n,m);

for i:=1 to n readln(fi,w[i],v[i]); close(fi); End; { -} Procedure outputdata; Begin assign(fo,'bag.out'); rewrite(fo); write(fo,F[n,m]); close(fo); End; { -} Function max(a,b:integer):integer; Begin

if a>b then max:=a else max:=b; End;

{ -} Procedure process;

Begin

for i:=1 to n

for j:=1 to m if w[i]<=j then

F[i,j]:=max(F[i-1,j],F[i-1,j-w[i]]+v[i])

else F[i,j]:=F[i-1,j];

End;

{ -} Begin

(5)

http://quyhoachdong.jimdo.com/ Page 21

Ngày đăng: 24/05/2021, 21:33

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w