Kỹ thuật nhánh cận

Một phần của tài liệu Bài tập Kỹ thuật lập trình - TS. Nguyễn Duy Phương (Trang 73 - 75)

II. Lập trình dựa vào kỹ thuật duyệt và đệ qui

1.8. Kỹ thuật nhánh cận

BÀI 2.4.1: DÃY ABC

Cho trước một số nguyên dương N (N ≤ 100), hãy tìm một xâu chỉ gồm các ký tự A, B, C thoả mãn 3 điều kiện:

- Có độ dài N

- Hai đoạn con bất kỳ liền nhau đều khác nhau (đoạn con là một dãy ký tự liên tiếp của xâu)

- Có ít ký tự C nhất.

Cách giải:

Nếu dãy X[1..n] thoả mãn 2 đoạn con bất kỳ liền nhau đều khác nhau, thì trong 4 ký tự liên tiếp bất kỳ bao giờ cũng phải có 1 ký tự “C”. Như vậy với một dãy con gồm k ký tự liên tiếp của dãy X thì số ký tự C trong dãy con đó bắt buộc phải ≥ k div 4.

Tại bước thử chọn X[i], nếu ta đã có T[i] ký tự “C” trong đoạn đã chọn từ X[1] đến X[i], thì cho dù các bước đệ quy tiếp sau làm tốt như thế nào chăng nữa, số ký tự “C” sẽ phải chọn thêm bao giờ cũng ≥ (n - i) div 4. Tức là nếu theo phương án chọn X[i] như thế này thì số ký tự “C” trong dãy kết quả (khi chọn đến X[n]) cho dù có làm tốt đến đâu cũng ≥ T[i] + (n - i) div 4. Ta dùng con số này để đánh giá nhánh cận, nếu nó nhiều hơn số ký tự “C” trong BestConfig thì chắc chắn có làm tiếp cũng chỉ được một cấu hình tồi tệ hơn, ta bỏ qua ngay cách chọn này và thử phương án khác.

Input: file văn bản ABC.INP chứa số nguyên dương n ≤ 100

Output: file văn bản ABC.OUT ghi xâu tìm được

Ví du ̣:

ABC.INP ABC.OUT

10 ABACABCBAB

74

BÀI 2.4.2: BÀI TOÁN NGƯỜI BÁN HÀNG

Xem bài 2.3.4.

BÀI 2.4.3: BÀI TOÁN TÌM ĐƯỜNG TRONG MÊ CUNG

Xem bài 2.3.3.

BÀI 2.4.4: BÀI TOÁN CÁI TÚI

Xem bài 2.1.10.

BÀI 2.4.5: BÀI TOÁN MÃ ĐI TUẦN

Xem bài 2.3.2.

BÀI 2.4.6: BÀI TOÁN XÊ ́P HA ̣U

Xem bài 2.3.1.

BÀI 2.4.7:

Cho dãy A[] gồm N số tự nhiên khác nhau và số tự nhiên K. Hãy sử dụng thuật toán quay lui nhánh cận viết chương trình liệt kê tất cả các dãy con của dãy số A[] sao cho tổng các phần tử trong dãy con đó đúng bằng K. Dữ liệu vào cho bởi file dayso.in theo khuôn dạng sau:

 Dòng đầu tiên ghi lại số tự nhiên N là số các số của dãy số A[] và số tự nhiên K, hai số được viết cách nhau bởi một vài khoảng trống;

 Dòng kế tiếp ghi lại N số của dãy số A[], hai số được viết cách nhau một vài khoảng trống.

Các dãy con thoả mãn điều kiện tìm được ghi lại trong file ketqua.out theo khuôn dạng sau:  Dòng đầu tiên ghi lại số các dãy con có tổng các phần tử đúng bằng K tìm được;  Những dòng kế tiếp mỗi dòng ghi lại một dãy con. Hai phần tử khác nhau của dãy

con được viết cách nhau bởi một vài khoảng trống.

75 5 50 5 10 15 20 25 3 10 15 25 5 20 25 5 10 15 20 BÀI 2.4.8:

Cho ma trận vuông C = (cij) cấp N (1 i, j N100) gồm N2 số tự nhiên (các số không nhất thiết phải khác nhau) ghi lại trong file matran.in theo khuôn dạng sau :

 Dòng đầu tiên ghi lại số tự nhiên N là cấp của ma trận vuông C;

 N dòng kế tiếp ghi lại ma trận vuông C = (cij). Hai phần tử khác nhau của ma trận được ghi cách nhau bởi một vài khoảng trống.

Hãy sử dụng thuật toán quay lui nhá nh cận viết chương trình lấy trên mỗi hàng, mỗi cột duy nhất một phần tử của ma trận C sao cho tổng các phần tử này là nhỏ nhất. Kết quả tìm được ghi lại trong file ketqua.out theo khuôn dạng:

 Dòng đầu tiên ghi lại tổng giá trị nhỏ nhất của N phần tử tìm được;

 N dòng kế tiếp, mỗi dòng ghi lại ba số i, j, cij tương ứng với chỉ số hàng, chỉ số cột và giá trị phần tử tương ứng của ma trận. Ba số được viết cách nhau một vài khoảng trống.

Ví dụ về file matran.inketqua.out:

matran.in ketqua.out 6 10 64 57 29 18 15 34 20 19 30 16 12 57 49 40 16 11 19 29 21 46 26 21 18 28 16 11 21 21 37 15 12 15 48 37 30 82 1 1 10 2 6 12 3 4 16 4 5 21 5 3 11 6 2 12

Một phần của tài liệu Bài tập Kỹ thuật lập trình - TS. Nguyễn Duy Phương (Trang 73 - 75)

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

(180 trang)