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

Một phần của tài liệu [Giáo trình] Phân tích thiết kế thuật toán và đánh giá độ phức tạp của giải thuật - ĐH Sư phạm Hà Nội (Trang 55 - 57)

3. Một số ví dụ minh họa

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

Bài toán 3.4. Cho n đồ vật (n ≤ 100), đồ vật thứ i có trọng lượng là wi (wi ≤ 100) và có giá trị sử dụng là ci (ci ≤ 100). Cần xếp đồ vật vào một cái túi sao cho tổng giá trị sử dụng được xếp vào túi là lớn nhất. Biết rằng cái túi chỉ có thể mang được trọng lượng không vượt quá b (b ≤ 100).

a) Phương pháp qui hoch động

Bước 1. Nêu giảđịnh về hàm qui hoạch động

Gọi f(i, j) là giá trị sử dụng lớn nhất của của các đồ vật được xếp vào túi khi chọn các đồ vật {1, 2, …, i} và trọng lượng giới hạn của túi là j. Khi đó giá trị nghiệm tốt nhất của bài toán là f(n, m).

Bước 2:Tìm nghiệm của các bài toán con đơn giản

Dễ thấy f(0, j) = 0 với mọi j = 1, 2, …, b

Bước 3: Xây dựng công thức qui hoạch động

Với giới hạn trọng lượng j, việc chọn tối ưu trong các đồ vật {1, 2, …, i - 1, i} để có giá trị lớn nhất có hai khả năng:

• Nếu không chọn đồ vật thứ i thì f(i, j) là giá trị sử dụng lớn nhất có thể bằng cách chọn trong các đồ vật {1, 2, …, i - 1} với trọng lượng j, tức là

f(i, j) = f (i-1, j)

• Nếu có chọn đồ vật i (với wi ≤ j) thì f(i, j) bằng giá trị sử dụng của đồ vật thứ i cộng với giá trị sử dụng lớn nhất có thể đượ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 là j - wi. Nói cách khác ta có công thức:

f(i, j) = ci + f(i-1, j - wi)

Kết hợp hai khả năng trên ta có công thức qui hoạch động: f(i, j) = max { f(i-1, j) , ci + f(i-1, j - wi)} với i = 1, 2, …, n và j = 0, 1, 2, .., M.

Bước 4. Tìm lại nghiệm

Ta đồng nhất hàm f(i,j) với bảng F[1..n, 1..b] (còn gọi là bảng qui hoạch động). Sau khi tính xong mảng F, việc truy vết trên F để tìm nghiệm như sau:

Chú ý rằng F[n, b] là giá trị sử dụng lớn nhất của các đồ vật được xếp vào túi khi xem xét tất cả n đồ vật và giới hạn trọng lượng của túi là b.

Nếu F[n , b] = F[n - 1, b] thì tức là không chọn đồ vật thứ n, ta truy tiếp F[n - 1, b]. Còn nếu F[n, b] ≠ F[n-1, b] thì chứng tỏ đồ vật thứ n được chọn, ta ghi nhận thành phần đó vào nghiệm và truy tiếp F[n-1, b-wn]. Cứ tiếp tục quá trình đó cho đến khi truy lên tới hàng thứ 0 của bảng F.

b) Mô phng Pascal procedure Caitui; begin for j := 0 to b do F[0, j] := 0; for i := 1 to n do for j := 1 to b do begin F[i, j] := F[i-1, j];

if (j > wi) and (F[i, j] < F[i-1, j-wi] + ci then F[i, j] := F[i, j] < F[i-1, j-wi] ;

end; end; procedure Trace; begin write(‘Max value: ‘, F[n, b]); while n ≠ 0 do begin if F[n, b] ≠ F[n-1, b] then begin

write(‘Chon do vat ‘, n, ‘ w = ‘, wn, ‘ value = ‘, vn); b := b - wn;

end; n := n - 1; end;

Một phần của tài liệu [Giáo trình] Phân tích thiết kế thuật toán và đánh giá độ phức tạp của giải thuật - ĐH Sư phạm Hà Nội (Trang 55 - 57)

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

(96 trang)