Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 21 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
21
Dung lượng
387 KB
Nội dung
MỤC LỤC MỞ ĐẦU .3 1.1 Lí chọn đề tài 1.2 Mục đích nghiên cứu 1.3 Đối tượng nghiên cứu phạm vi nghiên cứu .4 1.4 Phương pháp nghiên cứu .4 NỘI DUNG 2.1 CƠ SỞ LÝ THUYẾT 2.1.1 Kiến thức đại số tổ hợp .4 2.1.1.1 Hoán vị 2.1.1.2 Chỉnh hợp có lặp .5 2.1.2 Sinh hoán vị tổ hợp 2.1.2.1 Sinh hoán vị .6 2.1.2.2 Sinh tổ hợp 2.1.3 Thuật toán quay lui 2.2 THỰC TRẠNG .10 Trong q trình giảng dạy, tơi nhận thấy đa số em học sinh thực giải toán tin, em cần giải xong, giải toán mà em chưa tìm cách để giải tốn cách "sâu sắc" Từ giải được, em phải phân tích, nâng cấp, cải tiến để trở thành giải hay tốn Với cách làm đó, sau em giải xong tốn, ngồi rèn luyện tư lập trình, em tích lũy nhiều kiến thức, kỹ thuật cài đặt cho thao tác cụ thể 10 Đặc biệt, kỳ thi học sinh giỏi, phương pháp duyệt phương pháp thường học sinh lựa chọn khơng tìm phương pháp giải hiệu Như nhà bác học Thomas Edison phát biểu cách tìm kim đống rơm: "Trong chưa nghĩ cách thật hay việc rút cọng rơm rút kim" Vì vậy, thơng qua việc đưa giải pháp sử dụng thuật toán duyệt để giải số tốn, tơi mong bạn học sinh tự khắc phục hạn chế u thích mơn lập trình 10 2.3 MỘT SỐ GIẢI PHÁP SỬ DỤNG THUẬT TOÁN DUYỆT CHO MỘT SỐ BÀI TOÁN CƠ BẢN 10 2.3.1 Bài toán BỘ TAM HỢP .10 Như vậy, độ phức tạp thuật toán O(n + n2), rút gọp lại ta có độ phức tạp thuật tốn O(n2) 12 2.3.2 Bài tốn SINH DÃY NHỊ PHÂN CĨ ĐỘ DÀI N .12 2.3.3 Bài toán BIỂU THỨC ZERO 14 2.3.4 Bài toán CHIA KẸO 15 2.3.5 Bài toán MẬT KHẨU 16 2.3.6 Một số toán luyện tập 17 KẾT LUẬN .20 3.2 Kiến nghị 20 - Đối với tổ chun mơn: Tìm biện pháp để học sinh nâng cao tư lập trình Có thể thi lớp tìm giải pháp để giải toán theo tháng tuần, .20 TÀI LIỆU THAM KHẢO .21 MỞ ĐẦU 1.1 Lí chọn đề tài Các phương pháp duyệt thường xuất toán tổ hợp nhằm tìm kiếm tất trạng thái (tổ hợp) có tập trạng thái, tìm tổ hợp thoả mãn tốt số yêu cầu xác định số trạng thái tập hợp Lý thuyết tổ hợp phần quan trọng toán học rời rạc chuyên nghiên cứu phân bố phần tử vào tập hợp Thông thường phần tử hữu hạn việc phân bố chúng phải thoả mãn điều kiện định đó, tùy theo yêu cầu toán cần nghiên cứu Mỗi cách phân bố gọi cấu hình tổ hợp Liệt kê, đếm đối tượng có tính chất phần quan trọng lý thuyết tổ hợp Chúng ta cần phải đếm đối tượng để giải nhiều tốn khác Và tốn tin có liên quan đến toán tổ hợp chiếm tỷ lệ lớn Các phương pháp duyệt thông thường bao gồm: Phương pháp duyệt toàn bộ: Duyệt qua tất trạng thái có tập hợp Phương pháp phù hợp với toán liệt kê với tập hợp có số lượng trạng thái đủ nhỏ để không tốn thời gian duyệt Phương pháp duyệt chọn lọc: Thường áp dụng số lượng trạng thái tổ hợp lớn, sử dụng phương pháp duyệt toàn Phương pháp dùng cho tốn tìm kiếm (hoặc số) trạng thái tốt (theo số tiêu chí xác định) tổ hợp cách duyệt theo số trạng thái cho có khả tìm kết cao Các tốn giải phương pháp duyệt (thử sai) ngày chiếm vị trí quan trọng kỳ thi học sinh giỏi quốc gia, tin học trẻ, học sinh giỏi tỉnh Tốn thử sai dạng tốn khó, đòi hỏi tư lơgic, tư thuật tốn cao, tính hình tượng tốt, phù hợp với mục đích tuyển chọn học sinh có khả khiếu tốn tin Hơn nữa, nội dung toán kiểu ngày gần với thực tế, điều hoàn toàn phù hợp với xu hướng tin học đại Là giáo viên giảng dạy trường THPT Như Thanh, nhận thấy sử dụng phương pháp duyệt để giải số toán vấn đề người giáo viên nên đưa trình phát bồi dưỡng học sinh có khiếu lập trình Xuất phát từ lí tơi chọn đề tài: "Một số giải pháp sử dụng thuật toán duyệt để giải số toán bồi dưỡng học sinh giỏi" nhằm mục đích phục vụ tốt cho giáo viên xây dựng móng ban đầu cho học sinh u thích mơn lập trình 1.2 Mục đích nghiên cứu Mục đích đề tài đưa số giải pháp việc sử dụng thuật toán duyệt để giải số toán bồi dưỡng học sinh giỏi mức độ 1.3 Đối tượng nghiên cứu phạm vi nghiên cứu 1.3.1 Đối tượng nghiên cứu Ứng dụng phương pháp duyệt vào số tốn cụ thể 1.3.2 Phạm vi nghiên cứu Trong khn khổ sáng kiến kinh nghiệm, giới hạn số vấn đề sau: - Một số kiến thức đại số tổ hợp, thuật toán duyệt - Hướng dẫn giải số toán phương pháp duyệt 1.4 Phương pháp nghiên cứu - Hệ thống hóa số kiến thức có liên quan đến đại số tổ hợp thuật toán quay lui - Thiết kế thuật toán cho toán theo thứ tự tối ưu dần NỘI DUNG 2.1 CƠ SỞ LÝ THUYẾT 2.1.1 Kiến thức đại số tổ hợp 2.1.1.1 Hoán vị Cho tập hợp A gồm n phần tử (n ≥ 1) Mỗi cách thứ tự n phần tử tập hợp A gọi hốn vị n phần tử Gọi Pn số hốn vị n phần tử, ta có: Pn = n! = n(n-1)…2.1 Ví dụ: Cho A = {1, 2, 3}, hoán vị A là: 123 132 213 231 312 321 có 3! = hốn vị A 2.1.1.2 Chỉnh hợp có lặp Một cách xếp có thứ tự k phần tử lặp lại tập n phần tử gọi chỉnh hợp lặp chập k từ tập n phần tử Nếu A tập gồm n phần tử chỉnh hợp phần tử tập A k Ngoài ra, chỉnh hợp lặp chập k từ tập n phần tử hàm từ tập k phần tử vào tập n phần tử Vì số chỉnh hợp lặp chập k từ tập n phần tử nk 2.1.1.3 Chỉnh hợp không lặp Cho A tập hợp gồm n phần tử ( n ≥ 1) Mỗi gồm k phần tử ( ≤ k ≤ n) thứ tự tập hợp A gọi chỉnh hợp chập k n phần tử A Gọi Ank số hốn vị chập k n Ta có cơng thức sau: Ví dụ: Cho A = {1, 2, 3} Thì chỉnh hợp chập A (1, 2) (2, 1) (1, 3) (3, 1) (2, 3) (3, 2) Có tất chỉnh hợp chập A 2.1.1.4 Tổ hợp Cho tập hợp A gồm n phần tử ( n ≥ 1) Mỗi tập gồm k phần tử tập hợp A gọi tổ hợp chập k n phần tử cho Gọi Cnk số tổ hợp chập k n phần tử, ta có: Một số cơng thức tổ hợp: 2.1.2 Sinh hoán vị tổ hợp Phương pháp sinh áp dụng để giải toán liệt kê lý thuyết tổ hợp Để áp dụng phương pháp tốn phải thoả mãn hai điều kiện sau: - Có thể xác định thứ tự tập cấu hình tổ hợp cần liệt kê Từ xác định cấu hình cấu hình cuối thứ tự - Xây dựng thuật tốn cho phép từ cấu hình chưa phải cấu hình cuối, sinh cấu hình Phương pháp sinh mơ tả tổng quát sau: repeat Until 2.1.2.1 Sinh hốn vị Có nhiều thuật tốn phát triển để sinh n! hoán vị tập {1,2, ,n} Ta mô tả phương pháp đó, phương pháp liệt kê hốn vị tập {1,2, ,n} theo thứ tự từ điển Khi đó, hốn vị a1a2 an gọi trước hoán vị b1b2 bn tồn k (1 ≤ k ≤ n), a1 = b1, a2= =b2, , ak-1 = bk-1 ak < bk Thuật toán sinh hoán vị tập {1,2, ,n} dựa thủ tục xây dựng hoán vị kế tiếp, theo thứ tự từ điển, từ hoán vị cho trước a a2 an Đầu tiên an1 < an rõ ràng đổi chỗ a n-1 an cho nhận hoán vị liền sau hoán vị cho Nếu tồn số nguyên aj aj+1 cho aj aj+2 > > an, tức tìm cặp số nguyên liền kề tính từ bên phải sang bên trái hoán vị mà số đầu nhỏ số sau Sau đó, để nhận hốn vị liền sau ta đặt vào vị trí thứ j số nguyên nhỏ số lớn a j tập aj+1, aj+2, , an, liệt kê theo thứ tự tăng dần số lại a j, aj+1, aj+2, , an vào vị trí j+1, , n Dễ thấy khơng có hốn vị khác sau hoán vị xuất phát trước hoán vị vừa tạo Ví dụ: Tìm hốn vị liền sau theo thứ tự từ điển hoán vị 4736521 Cặp số ngun tính từ phải qua trái có số trước nhỏ số sau a3 = a4 = Số nhỏ số bên phải số mà lại lớn số Đặt số vào vị trí thứ Sau đặt số 3, 6, 1, theo thứ tự tăng dần vào bốn vị trí lại Hoán vị liền sau hoán vị cho 4751236 procedure Hoan_vi _lien_sau (a1, a2, , an); Begin j := n − 1; while aj > aj+1 j := j − {j số lớn mà aj < aj+1} k := n; while aj > ak k := k – 1; {ak số nguyên nhỏ số lớn aj bên phải aj} đổi chỗ (aj, ak); r := n; s := j + 1; while r > s Begin đổi chỗ (ar, as); r := r - ; s := s + 1; end; {Điều xếp phần hốn vị sau vị trí thứ j theo thứ tự tăng dần.} end; 2.1.2.2 Sinh tổ hợp Làm để tạo tất tổ hợp phần tử tập hữu hạn? Vì tổ hợp tập con, nên ta dùng phép tương ứng 1-1 tập {a1,a2, ,an} xâu nhị phân độ dài n Ta thấy xâu nhị phân độ dài n khai triển nhị phân số nguyên nằm 2n − Khi 2n xâu nhị phân liệt kê theo thứ tự tăng dần số nguyên biểu diễn nhị phân chúng Chúng ta xâu nhị phân nhỏ 00 00 (n số 0) Mỗi bước để tìm xâu liền sau ta tìm vị trí tính từ phải qua trái mà số 0, sau thay tất số bên phải số đặt số vào vị trí procedure Xau_nhi_phan_lien_sau(bn-1bn-2 b1b0); Begin i := 0; while bi = begin bi := 0; i := i + 1; end; bi := 1; End; Tiếp theo trình bày thuật toán tạo tổ hợp chập k từ n phần tử {1,2, ,n} Mỗi tổ hợp chập k biểu diễn xâu tăng Khi liệt kê tổ hợp theo thứ tự từ điển Có thể xây dựng tổ hợp liền sau tổ hợp a1a2 ak cách sau Trước hết, tìm phần tử a i dãy cho kể từ phải qua trái cho ≠ n − k + i Sau thay + aj + j − i + với j = i + 1, i + 2, , k Ví dụ: Tìm tổ hợp chập từ tập {1, 2, 3, 4, 5, 6} liền sau tổ hợp {1, 2, 5, 6} Ta thấy từ phải qua trái a2 = số hạng tổ hợp cho thỏa mãn điều kiện ≠ − + i Để nhận tổ hợp tiếp sau ta tăng a i lên đơn vị, tức a2 = 3, sau đặt a3 = + = a4 = + = Vậy tổ hợp liền sau tổ hợp cho {1,3,4,5} Thủ tục cho dạng thuật toán sau: Procedure To_hop_lien_sau (a1, a2, , ak); Begin i := k; while = n −k + i i := i −1; := + 1; for j := i + to k aj := + j −i; End; 2.1.3 Thuật toán quay lui Nét đặc trưng phương pháp chỗ bước đến lời giải hồn tồn cách làm thử Nếu có lựa chọn chấp nhân ghi nhớ thơng tin cần thiết bước thử Trái lại, khơng có lựa chọn thích hợp làm lại bước trước, xoá bớt ghi nhớ quay chu trình thử với lựa chọn lại Hành động gọi quay lui (Back tracking) giải thuật thể phương pháp gọi giải thuật quay lui Nội dung phương pháp việc xây dựng dần thành phần cấu hình cách thử tất khả Giả thiết cấu hình cần tìm mô tả giá trị (x ,x , ,x N ) Giả sử xác định i - thành phần (x ,x , ,x i-1 ), ta xác định thành phần x i cách duyệt tất khả đề cử cho (đánh số từ đến n i ).Với khả j, kiểm tra xem j có chấp nhận hay khơng Có thể có hai trường hợp xảy ra: - Nếu j chấp nhận xác định x i theo j, sau j = N ta cấu hình, trái lại ta tiếp tục tiến hành việc xác định x i+1 - Nếu thử tất khả mà khơng có khả chấp nhận ta lùi lại bước trước để xác định x i-1 Cần phải lưu ý ta phải ghi nhớ bước qua, khả thử để tránh trùng lặp Những thông tin lưu trữ theo kiểu liệu ngăn xếp - Stack ( vào sau trước) - nên thuật tốn phù hợp thể thủ tục đệ quy Ta mô tả bước xác định xi thủ tục đệ quy sau: Procedure Try (i); Begin For Do Begin ; if Then else begin ; Try(i+1); ; end; end; End; Thuật toán quay lui bắt đầu lời gọi Try(1); Trong thủ tục mô tả trên, điều quan trọng đưa danh sách khả đề cử xác định giá trị biểu thức logic [chấp nhận v] Ngoài việc phụ thuộc v, giá trị phụ thuộc vào việc chọn khả i – bước trước Trong trường hợp vậy, cần ghi nhớ trạng thái trình sau [xác định xi theo v] trả lại trạng thái cũ sau lời gọi Try(i+1) Các trạng thái ghi nhận nhờ số biến tổng thể (global), gọi biến trạng thái Dễ thấy tốn vơ nghiệm ta duyệt hết khả mà khơng có khả thoả mãn u cầu Ta nói vét cạn trường hợp Chú ý đến lúc ta phải lùi liên tiếp nhiều lần.Từ suy rằng, thơng thường tốn vơ nghiệm khơng thể lùi 2.1.4 Những vấn đề cần ý giải toán phương pháp thử sai 2.1.4.1 Đoán nhận vector nghiệm Để giải toán phương pháp thử sai, việc phải làm xác định vector nghiệm, cụ thể cần xác định: vector nghiệm gồm thành phần (ý nghĩa thành phần), miền giá trị thành phần ràng buộc thành phần Đây công việc quan trọng mang ý nghĩa định đến việc giải toán 2.1.4.2 Giảm thiểu số trường hợp phải thử, giảm thiểu chi phí kiểm tra Qua cách tính độ phức tạp phương pháp thử sai sau: Độ phức tạp số khả thử nhân với chi phí trung bình kiểm tra khả Ta nhận thấy, để giảm độ phức tạp thuật toán ta giảm thiểu số khả phải thử giảm chi phí kiểm tra 2.1.4.3 Một số độ phức tạp thường gặp Độ phức tạp Giá trị n giải (Dùng với máy chạy CPU core i3) O(n) n~100.000.000 O(n.Logn) n~1.000.000 O(n2) n~10000 O(n3) n~460 2.2 THỰC TRẠNG Trong q trình giảng dạy, tơi nhận thấy đa số em học sinh thực giải toán tin, em cần giải xong, giải toán mà em chưa tìm cách để giải tốn cách "sâu sắc" Từ giải được, em phải phân tích, nâng cấp, cải tiến để trở thành giải hay tốn Với cách làm đó, sau em giải xong tốn, ngồi rèn luyện tư lập trình, em tích lũy nhiều kiến thức, kỹ thuật cài đặt cho thao tác cụ thể Đặc biệt, kỳ thi học sinh giỏi, phương pháp duyệt phương pháp thường học sinh lựa chọn khơng tìm phương pháp giải hiệu Như nhà bác học Thomas Edison phát biểu cách tìm kim đống rơm: "Trong chưa nghĩ cách thật hay việc rút cọng rơm rút kim" Vì vậy, thơng qua việc đưa giải pháp sử dụng thuật toán duyệt để giải số tốn, tơi mong bạn học sinh tự khắc phục hạn chế u thích mơn lập trình 2.3 MỘT SỐ GIẢI PHÁP SỬ DỤNG THUẬT TOÁN DUYỆT CHO MỘT SỐ BÀI TỐN CƠ BẢN 2.3.1 Bài tốn BỘ TAM HỢP 2.3.1.1 Đề Cho dãy số nguyên a1, a2, , an, số khác đôi (3 ≤ n ≤ 5000; với i ta có |ai| ≤ 106) Bộ ba số ai, aj, ak (i ≠ j ≠ k) gọi Bộ tam hợp có số ba số trung bình cộng hai số lại u cầu: Hãy đếm số lượng tam hợp tìm tam hợp có tổng giá trị ba số lớn Dữ liệu vào: Đọc từ file văn có tên TAMHOP.INP có cấu trúc sau: - Dòng chứa số n; - Dòng chứa n số a1, a2, , an cách dấu cách Dữ liệu ra: Ghi file văn có tên TAMHOP.OUT có cấu trúc sau: - Dòng ghi số nguyên dương số lượng tam hợp tìm được; - Dòng ghi tổng giá trị ba số tam hợp lớn Ví dụ: TAMHOP.INP TAMHOP.OUT 10 6192348 18 2.3.1.2 Hướng dẫn giải a Lời giải O(n3) - Xác định vector nghiệm: (x1,x2,x3) 1≤ x1,x2,x3≤n tương ứng số (i,j,k) - Xác định ràng buộc: có số ba số trung bình cộng hai số lại Để liệt kê tất khả ta sử dụng ba vòng lặp lồng sau Procedure Bai2_p1; Begin count:=0; For x1:=1 To N-2 Do For x2:=x1+1 To N-1 Do For x3:=x2+1 To N Do If isOK(x1,x2,x3) Then Inc(Count); End; Trong hàm isOK(x1,x2,x3) nhận ba tham số đầu vào ba số dãy số có nhiệm vụ kiểm tra ràng buộc, trả TRUE thỏa mãn ràng buộc, FALSE trường ngược lại Độ phức tạp thuật toán: Số trường hợp thử O(n 3) nhân với chi phí kiểm tra O(1), độ phức tạp thuật toán O(n3) b Lời giải O(n2.Logn) Để giảm độ phức tạp thuật toán ta giảm số trường hợp thử xuống O(n 2) tăng chi phí kiểm tra lên O(Logn) sau: - Sắp xếp dãy số theo thứ tự tăng dần (dùng Quick Sort có độ phức tạp O(n.Logn)) - Dùng hai vòng để liệt kê trường hợp thử cho x1 x2, biết phần tử A[x1], A[x2] biết phần tử A[x3] - Dùng tìm kiếm nhị phân để xem A[x3] có dãy xếp trước chưa Procedure bai2_p2; Begin Quicksort; {Sắp xếp dãy số} count:=0; For x1:=1 To N-2 Do For x2:=x1+1 To N-1 Do Begin x:=A[x2]*2-A[x1]; If Binary(x) Then Inc(Count); end; End; 11 Như vậy, độ phức tạp thuật toán O(n.Logn + n 2.Logn), rút gọp lại ta có độ phức tạp thuật tốn O(n2.Logn) c Lời giải O(n2) Để giảm độ phức tạp thuật toán ta giữ nguyên số trường hợp thử O(n 2) giảm chi phí kiểm tra lên xuống O(1) sau: - Dùng mảng KT[A[i]] =1 để đánh dấu số A[i] có xuất dãy số - Dùng hai vòng để liệt kê trường hợp thử cho x1 x2, biết phần tử A[x1], A[x2] biết phần tử A[x3] - Kiểm tra xem A[x3] có tồn mảng KT hay khơng cách: Nếu KT[A[x3]] =1 tồn số A[x3] Procedure Bai2_p3; Begin For i:=1 To N Do Inc(KT(A[i]); count:=0; For x1:=1 To N-2 Do For x2:=x1+1 To N-1 Do Begin x:=A[x2]*2-A[x1]; If KT(x)=1 Then Inc(Count); End; End; Như vậy, độ phức tạp thuật toán O(n + n 2), rút gọp lại ta có độ phức tạp thuật tốn O(n2) 2.3.2 Bài tốn SINH DÃY NHỊ PHÂN CÓ ĐỘ DÀI N 2.3.2.1 Đề Dãy nhị phân có độ dài N dãy X[1 N] X[i] {0,1} (∀i: ≤ i ≤ N) Ví dụ: với N = ta có dãy nhị phân sau: 000, 001, 010, 011, 100, 101, 110, 111 Yêu cầu: Hãy viết chương trình liệt kê tất dãy nhị phân có độ dài N Dữ liệu vào: Cho file văn có cấu trúc sau: - Dòng 1: Ghi số nguyên dương N (1 ≤ N ≤ 255) Dữ liệu ra: Ghi file văn BSTR.OUT theo cấu trúc sau: - Trên dòng: Ghi dãy nhị phân có độ dài N tìm Ví dụ: BSTR.INP BSTR.OUT 000 001 010 011 100 12 101 110 111 2.3.2.2 Hướng dẫn * Lời giải O(2n) Tư tưởng thuật toán tạo dãy nhị phân độ dài n bit vét cạn Tơi nói “vét cạn” lẽ với cấu hình vừa tạo được, bạn xét trường hợp riêng lẻ, cấu hình cuối (cấu hình đích), bạn xét cụ thể tất trường hợp định.Thuật toán tạo dãy nhị phân gồm có tất phương pháp, phương pháp liệt kê phương pháp sinh Tôi giới thiệu cho bạn phương pháp * Phương pháp liệt kê Đây phương pháp dùng kĩ thuật đệ quy quay lui, có lẽ mà tốc độ tạo dãy bị hạn chế tối đa chất kĩ thuật Song, việc tạo dãy với phương pháp xem dễ hiểu “trong sáng” Cấu hình khởi điểm dãy tất phần tử có giá trị (fillchar(a, sizeof(a), 0);) Sau dùng giá trị {0,1} để thử gán cho phần tử a[i], tiếp tục với phần tử a[i+1] Khi kiểm tra thấy cấu hình a[1 n] đươc gán xong (tức i = n) in cấu hình Chương trình kết thúc đạt cấu hình đích (tất giá trị phần tử 1) Procedure Try (i : integer); Var j : byte; Begin For j := to Begin a[i] := j; {Thử gán j = {0,1} cho a[i]} if (i = n) then Print(a) {Nếu cấu hình hồn thành tiến hành in ra} else Try(i+1); {Nếu chưa hồn thành cấu hình thử gán cho phần tử thứ i+1} End; End; 13 * Dùng phương pháp sinh: Phương pháp duyệt từ cuối mảng trở ngược lên đầu mảng, tìm số cấu hình: - Nếu tồn số thay a[i] = 1, sau tiếp tục thay tất cấu hình sau i (i+1, i+2, …) thành - Nếu không tồn số có nghĩa dãy tồn số 1, đạt cấu hình đích Kết thúc chương trình Procedure BSTR; Begin Fillchar (x, sizeof (x), 0); {Cấu hình ban đầu} Repeat ; i:=n; While (i>0) and (Xi=1) Dec(i); If i>0 then {chưa gặp cấu hình cuối cùng} Begin Xi:=1; ; End; Until i= 0; End; 2.3.3 Bài toán BIỂU THỨC ZERO 2.3.3.1 Đề Cho số tự nhiên N ≤ Giữa số từ đến N thêm vào dấu + (cộng) – (trừ) cho kết thu Yêu cầu: Hãy viết chương trình tìm tất khả Dữ liệu vào: Lấy từ file văn ZERO.INP với dòng ghi số N Dữ liệu ra: Ghi vào file văn có tên ZERO.OUT có cấu trúc sau: - Dòng đầu ghi số lượng kết tìm - Các dòng sau dòng ghi kết tìm 14 Ví dụ 2.3.3.2 Hướng dẫn Áp dụng thuật toán đệ quy quay lui để giải toán nay, ta dùng thủ tục đệ quy Try(i) Giả sử ta điền dấu’+’ ’-’ vào số từ đến i, cần điền dấu i i + Ta chọn ba khả năng: điền dấu ’+’, điền dấu ’-’, không điền dấu Khi chọn ba khả trên, ta tiếp tục lựa chọn dấu để điền vào i + i + cách gọi đệ quy Try(i+1) Ta duyệt tất khả để tìm tất nghiệm tốn, tốn khơng bị thiếu nghiệm Nếu i = N ta kiểm tra xem cách điền có thoả mãn kết hay khơng Để kiểm tra ta dùng thủ tục Test chương trình Nếu tổng cách điền nghiệm tốn, ta ghi nhận Nếu i < N tiếp tục gọi Try(i+1) Trong chương trình ta dùng biến dem để đếm cách điền thoả mãn, mảng M kiểu string ghi nhận cách điền dấu thoả mãn yêu cầu tốn Thuật tốn có độ phức tạp O(3n-1) 2.3.4 Bài tốn CHIA KẸO 2.3.4.1 Đề Có N gói kẹo, gói thứ i có A[i] kẹo Yêu cầu: Hãy tìm cách chia gói kẹo thành phần cho độ chênh lệch tổng số kẹo hai phần