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