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í dụ:

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, cijtươ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.in và ketqua.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)