Bài toán này th−ờng bị giải sai. Chúng tôi sẽ đ−a ra cách giải đúng và một số ví dụ để phát hiện các lỗi trong các cách giải sai.
Cách mua tối −u không bị thừa đ−ợc tìm theo cách sau : n1 = n/144 ; m=n-n1*144
n2 = m/12 ; n3=m-n2*12
Để hạ giá mua đó chỉ có 2 cách ; hoặc mua thêm cả tá chứ không mua các đôi lẻ, hoặc mua thêm cả hộp chứ không mua các tá lẻ, đôi lẻ.
Nếu n3 * 1.05 > 10.25 thì cần lấy thêm cả tá. N2 = n2 +1 ; n3 = 0
Nếu hàng mua đ−ợc ( số cũ hoặc đã thay đổi ) là :
N2*10.25 + n3*1.05 > 114.00, thì cần mua thêm cả hộp N1 = n1+1 ; n2 = 0 ; n3 =0.
Lời giải này phù hợp với mọi giá ( mà cả hộp rẻ hơn 12 tá, còn cả tá rẻ hơn 12 đôi ). Ví dụ : n n1 n2 n3 9 0 0 9 10 0 1 0 131 0 11 0 134 1 0 0 88.5. Đ−a về bằng 0 :
Đơn giản hơn cả là đ−a thêm vào hai mảng bổ trợ là B[1:m] và C[1:n]. Tiếp sau đó, khi xét các phần tử cùng mảng A, ta đánh dấu trong các mảng B và C các dòng và các cột có chứa các số 0, tức là làm
If A[i,j]=0 then B[i]=1 ; C[j]=1
Bây giờ khi duyệt lại bảng A ta thêm bằng các số 0. Các phần tử đứng ở các dòng và cột đã đ−ợc đánh dấu trong các mảng B hoặc C , tức là :
If B[i]=1 or C[j]=1 then A[i,j]=0
Có thể đề xuất cách giải khác chỉ cần sử dụng một mảng phụ C[1:n]. Trong các tr−ờng hợp đó mảng A sẽ đ−ợc xét theo các dòng. Các cột có chứa các phần tử 0 vẫn đ−ợc đánh dấu trong mảng C nh− tr−ớc, còn có gặp hay không số 0 trong dòng đang xét đ−ợc đánh dấu trong biến z, tức là
If A[i,j]=0 then C[j]=1 ; z=1
Trang 28
C[j]=1. Ch−ơng trình này đ−ợc đ−a ra ở 88.5
Các lỗi phổ biến khi giải bài này là :
1. 1. Xem xét mảng A, và nếu phần tử A[i,j]=0 thì cho bằng 0 hoặc dòng i, hoặc cột j, hoặc cả hai cái đó. Khi xem xét tiếp tục các phần tử đã đ−a về bằng 0 đ−ợc coi là bằng 0 từ đầu và dẫn đến các b−ớc đ−a về 0 không cần thiết.
2. Xem xét mảng A, và nếu A[i,j]=0, thì đ−a j vào phần tử C[k] tiếp theo. Từ đó cùng với các chỉ số j có thể đ−ợc đ−a đi nhiều lần, và mảng C có thể cần độ dài m*n trái với giả thiết.
Trang 29