Công thức truy hồi có hai biến

Một phần của tài liệu Tổ chức dữ liệu và thuật toán cho các bài toán quy hoạch động (Trang 34 - 35)

5. Ý nghĩa khoa học của đề tài

2.1.3.2. Công thức truy hồi có hai biến

Với các bài toán mà ta phải quan tâm đến hai đối tượng trong bài. Khi lập công thức truy hồi loại này thường phụ thuộc vào hai biến. Ta xét bài toán sau:

Bài toán cái túi

Trong siêu thị có n gói hàng (n ≤ 100), gói hàng thứ i có trọng lượng là

W[i] ≤ 100 và trị giá V[i] ≤ 100. Một tên trộm đột nhập vào siêu thị, tên trộm

mang theo một cái túi có thể mang được tối đa trọng lượng M (M ≤ 100). Hỏi tên trộm sẽ lấy đi những gói hàng nào để được tổng giá trị lớn nhất.

Thuật toán: Quy hoạch động

Đối tượng mà ta quan tâm là n gói hàng và trọng lượng tối đa là W. Với

n gói hàng và trọng lượng tối đa là W thì giá trị lớn nhất trong các gói hàng

tên trộm lấy trong túi là bao nhiêu. Vì vậy ta gọi hàm F(i, j) trả về giá trị lớn nhất có thể có bằng cách chọn trong các gói {1, 2,…, i} với giới hạn trọng

lượng j. Thì giá trị lớn nhất khi chọn trong số n gói với giới hạn trọng lượng

M chính là F(n, M).

Công thức truy hồi tính F(i, j).

Với giới hạn trọng lượng j, việc chọn tối ưu trong số các gói {1, 2,…,

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn

o Nếu không chọn gói thứ i thì F(i, j) là giá trị lớn nhất có thể bằng cách chọn trong số các gói {1, 2,…, i - 1} với giới hạn trọng lượng là j. Tức là F(i, j) = F(i - 1, j)

o Nếu có chọn gói thứ i (tất nhiên chỉ xét tới trường hợp này khi mà W[i] ≤ j) thì F(i, j) bằng giá trị gói thứ i là V[i] cộng với giá trị lớn nhất có thể có được bằng cách chọn trong số các gói {1, 2,…, i - 1} với giới

hạn trọng lượng j - W[i]. Tức là về mặt giá trị thu được: F(i, j) = V[i] +

F(i - 1, j - W[i])

Vì theo cách xây dựng F(i, j) là giá trị lớn nhất có thể, nên F(i, j) sẽ là Max trong hai giá trị thu được ở trên [5].

Đoạn chương trình viết bằng ngôn ngữ Pascal

Procedure make_table; Var i,j:integer; Begin for j:=0 to m do f[0,j]:=0; for i:=1 to n do for j:=0 to m do begin f[i,j]:=f[i-1,j];

if (j>=w[i]) and (f[i,j]< f[i-1,j-w[i]]+v[i]) then

f[i,j]:=f[i-1,j-w[i]]+v[i]; end;

End;

Một phần của tài liệu Tổ chức dữ liệu và thuật toán cho các bài toán quy hoạch động (Trang 34 - 35)

Tải bản đầy đủ (PDF)

(70 trang)