PHƢƠNG PHÁP SINH I. Khái niệm Phương pháp sinh được sử dụng trong bài toán liệt kê, ví dụ như người ta cần liệt kê tổ hợp chập k của n phần tử hay hoá

Tài liệu tương tự
Mảng Mảng Bởi: Thu Nguyen DỮ LIỆU KIỂU MẢNG (ARRAY) I. KHAI BÁO MẢNG Cú pháp: TYPE VAR <Kiểu mảng> = ARRAY [chỉ số] OF <Kiểu dữ liệu>; <Biến mảng>:<ki

Tìm đường đi và kiểm tra tính liên thông Tìm đường đi và kiểm tra tính liên thông Bởi: Thạc sĩ Nguyễn Thanh Hùng Trong mục này ta xét ứng dụng các thu

Trung Tâm Gia Sư Tài Năng Việt Đề Số 1 Câu 1: Sau khi thực hiện đoạn chương trình sau, giá trị của biến S bằng bao nhiêu: S

HỘI THI TIN HỌC TRẺ TỈNH AN GIANG ĐỀ CHÍNH THỨC ĐỀ THI LÝ THUYẾT BẢNG A - KHỐI TIỂU HỌC Khóa ngày: Thời gian : 20 phút (không kể thời gian

NGÔN NGƯ LÂ P TRIǸH Biên tập bởi: nguyenvanlinh

Tìm hiểu ngôn ngữ lập trình Visual Basic Tìm hiểu ngôn ngữ lập trình Visual Basic Bởi: Khuyet Danh Tìm hiểu ngôn ngữ lập trình Visual Basic Tổng quan

Con trỏ và cấu trúc động Con trỏ và cấu trúc động Bởi: Thu Nguyen CON TRỎ VÀ CẤU TRÚC ĐỘNG 1. Khái niệm: Khi khai báo một biến, dù là biến đơn hay biế

9-KiemThu

Bài toán cây khung nhỏ nhất Bài toán cây khung nhỏ nhất Bởi: Khoa CNTT ĐHSP KT Hưng Yên Bài toán cây khung nhỏ nhất Bài toán cây khung nhỏ nhất của đồ

Phương pháp biểu diễn thuật toán Phương pháp biểu diễn thuật toán Bởi: Khoa CNTT ĐHSP KT Hưng Yên Khi chứng minh hoặc giải một bài toán trong toán học

Slide 1

Các biến và các kiểu dữ liệu trong JavaScript Các biến và các kiểu dữ liệu trong JavaScript Bởi: Hà Nội Aptech Các biến (Variables) Biến là một tham c

TẬP ĐOÀN VIỄN THÔNG QUÂN ĐỘI VIETTEL TRUNG TÂM CÔNG NGHỆ THÔNG TIN 1 HƯỚNG DẪN SỬ DỤNG HỆ THỐNG QUẢN LÝ VÀ ĐIỀU HÀNH VĂN BẢN ĐIỆN TỬ Đối tượng Văn thư

OpenStax-CNX module: m Xâu ký t. * Thu Nguyen This work is produced by OpenStax-CNX and licensed under the Creative Commons Attribution License

Kiểu dữ liệu văn bản Kiểu dữ liệu văn bản Bởi: PGS. TS. NGƯT Phạm Văn Huấn Ngoài những dữ liệu số như các số nguyên, số thực, máy tính còn có thể lưu

I. MSWLogo là gì. Giới thiệu. Là một ngôn ngữ lập trình được thiết kế và phát triển bởi Seymour Papert, Daniel Bobrow và Wallace Feurzeig. Trong chươn

Bài tập chương 1 ngôn ngữ lập trình visual basic Bài tập chương 1 ngôn ngữ lập trình visual basic Bởi: Khoa CNTT ĐHSP KT Hưng Yên MỤC TIÊU: SAU KHI HO

Lập trình cấu trúc trong Visual Basic Lập trình cấu trúc trong Visual Basic Bởi: Nguyễn Sơn Học xong chương này, sinh viên phải nắm bắt được các vấn đ

Câu lệnh (statement) Câu lệnh (statement) Bởi: Khuyet Danh Trong C# một chỉ dẫn lập trình đầy đủ được gọi là câu lệnh. Chương trình bao gồm nhiều câu

TRẢ LỜI KIẾN NGHỊ CỬ TRI SAU KỲ HỌP THỨ 3 HĐND TỈNH KHÓA IX ĐƠN VỊ: THÀNH PHỐ THỦ DẦU MỘT 1. Cử tri phường Định Hòa phản ánh: Quỹ quốc phòng an ninh k

Hướng dẫn sử dụng Mobile Service

ĐẠI HỌC QUỐC GIA HÀ NỘI KHOA LUẬT NGUYỄN THU TRANG HIỆU LỰC CỦA HỢP ĐỒNG MUA BÁN NHÀ Ở HÌNH THÀNH TRONG TƢƠNG LAI THEO PHÁP LUẬT V

ĐỀ cương chương trình đẠi hỌc

Microsoft Word - cau-truc-du-lieu-hang-doi.docx

ĐIỆN BIÊN PHỦ TRÊN KHÔNG : CON NGƯỜI ĐÃ THẮNG VŨ KHÍ! Nhắc lại những ngày tháng oanh liệt trong chiến tranh chống đế quốc Mỹ năm 1972 để ghi nhớ từng

DANH SÁCH SINH VIÊN THAM DỰ CHUYÊN ĐỀ "NÓI KHÔNG VỚI MA TÚY" THỜI GIAN: 8g30 NGÀY 29/10/2017 TẠI HỘI TRƯỜNG I STT MSSV HỌ TÊN Ngô Thị Phụng

03_Tap hop_P2_Baigiang

CHÍNH PHỦ CỘNG HÕA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập - Tự do - Hạnh phúc Số: 134/2016/NĐ-CP Hà Nội, ngày 01 tháng 09 năm 2016

OpenStax-CNX module: m Lập trình hàm ThS. Nguyễn Văn Linh This work is produced by OpenStax-CNX and licensed under the Creative Commons Attribu

TÁM QUY LUẬT CỦA NGƯỜI PHIÊN DỊCH KINH ĐIỂN PHẬT HỌC 1. Người dịch phải tự thoát mình ra khỏi động cơ truy tìm danh lợi. 2. Người dịch phải tu dưỡng t

Bình giảng bài thơ thu vịnh của Nguyễn Khuyến

Số nguyên tố Sinh số nguyên tố mạnh dùng trong mật mã Nguyễn Đức Thắng Sinh viên TI26 TLU 1 / 23

Những cơ sở của ngôn ngữ C# Những cơ sở của ngôn ngữ C# Bởi: phamvanviet truonglapvy Trong chương này sẽ trình bày về hệ thống kiểu trong C#; phân biệ

ĐẠI HỌC QUỐC GIA HÀ NỘI TRƢỜNG ĐẠI HỌC KINH TẾ PHẠM HẢI HÀ QUẢN LÝ NGÂN SÁCH CẤP HUYỆN CỦA THÀNH PHỐ UÔNG BÍ, TỈNH QUẢNG NINH LU

HƢỚNG DẪN SỬ DỤNG ACB ONLINE ACB - ibanking (Phiên bản Mobile Web Dành cho khách hàng Cá Nhân) Biên soạn: Ngân hàng điện tử ACB Cập nhật: Tháng

THỰC TRẠNG DẠY VÀ HỌC MÔN VẬT LÝ TRONG TRƯỜNG THCS HIỆN NAY, NGUYÊN NHÂN VÀ GIẢI PHÁP KHẮC PHỤC

Contents

HỌC VIỆN KỸ THUẬT QUÂN SỰ KHOA CÔNG NGHỆ THÔNG TIN CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập Tự do Hạnh phúc 1. Thông tin về giáo viên ĐỀ CƯƠNG CHI T

Loi vong lap lap vo tan - Worksheet_Change

Binh pháp Tôn Tử và hơn 200 trận đánh nổi tiếng trong lịch sử Trung Quốc Chia sẽ ebook : Tham gia cộng đồng chia sẽ sá

Table of Contents TRI THONG MINH TINH DUC Phan 1. MOT CACH TIEP CAN MOI Chuong 1. CO PHAI LA NO LE CUA NOI DAM ME? Chuong 2. CAI TOI TINH DUC THAM KIN

Tải truyện Khi Em Từ Bỏ Tình Yêu | Chương 13 : Chương 13

SỞ GD&ĐT GIA LAI ĐỀ CHÍNH THỨC KIỂM TRA HỌC KÌ I, NĂM HỌC Môn: Vật lí lớp 12 - THPT Thời gian làm bài: 60 phút; (48 câu trắc nghiệm) Họ, tên


Tự hào thanh niên xung phong Tây Nam bộ Trong những năm kháng chiến chống Mỹ cứu nước, cùng với cả nước, hàng ngàn thanh niên xung phong (TNXP) Tây Na

Microsoft Word - Cam bay trong khai cuoc va cac bien phap tra don

Tài chính, tín dụng, ngân hàng và lưu thông tiền tệ trong thời kỳ quá độ lên chủ nghĩa xã hội ở Việt Nam Tài chính, tín dụng, ngân hàng và lưu thông t

DỰ ÁN XÂY NHÀ TÌNH THƢƠNG (TẠI CHÙA LIÊN SƠN) Thực hiện : Phạm Thị Hồng Yến Thầy : Chơn Nguyên Chủ trì chùa Liên Sơn Tổ 7, ấp 5, Xã Thanh Sơn, Định Qu

DSSV THAM GIA 02 CHUYÊN ĐỀ SHCD CUỐI KHÓA NĂM HỌC HƯỚNG DẪN: Sinh viên nhân tổ hợp phím CTRL+F, nhập MSSV và nhấn phím ENTER để kiểm tra tên

Microsoft Word - unicode.doc

TRƯỜnG ĐẠI HỌC BÁCH KHOA HÀ nội VIỆn CÔnG nghệ THÔnG TIn VÀ TRUYỀn THÔnG TIN HỌC ĐẠI CƯƠNG Bài 10. Các cấu trúc lập trình trong C Nội dung 1. Cấu trúc

Chiều Trên Phá Tam Giang Trần Thiện Thanh Chiều Trên Phá Tam Giang anh chợt nhớ em nhớ ôi niềm nhớ ôi niềm nhớ đến bất tận em ơi! em ơi! Giờ này thươn

Microsoft Word - Huong dan su dung phan mem Evyhome.docx

TRƯỜNG ĐH GIAO THÔNG VẬN TẢI THÀNH PHỐ HỒ CHÍ MINH HỘI ĐỒNG TUYỂN SINH DANH SÁCH TÂN SINH VIÊN ĐÃ NỘP GIẤY CHỨNG NHẬN KẾT QUẢ (BẢN GỐC) Bưu điện - Cập

Copyright vietjack.com Chuỗi (String) trong C# Trong C#, bạn có thể sử dụng các chuỗi (string) như là mảng các ký

HON VONG QUOC chapitre 2

Microsoft Word - NhanngaybanhanhHienphapVNCHFinal.doc

ĐỐI THOẠI VỀ CÁC VẤN ĐỀ CHÍNH SÁCH TRONG QUẢN LÝ MÔI TRƯỜNG LÀNG NGHỀ TỈNH BẮC NINH

TRƯỜNG ĐẠI HỌC AN GIANG

Hạ Nguồn Sông Mekong trong Cơn Khát Vô Tận của Bắc Kinh Gần hai mươi triệu người Việt Nam phụ thuộc vào nước ở hạ nguồn sông Mekong. Nhưng thượng nguồ

Microsoft Word - co_ban_ve_jquery.docx

Nghị luân xã hội về vấn nạn Game online trong học đường

Microsoft Word - WDRMainMessagesTranslatedVChiedit.docx

CHƢƠNG TRÌNH TOUR 2019: ĐÀ NẴNG - THÀNH PHỐ ĐÁNG SỐNG PHỐ CỔ HỘI AN - DI SẢN VĂN HÓA THẾ GIỚI THAM QUAN BÁN ĐẢO SƠN TRÀ CHÙA LINH ỨNG BẢO TÀNG ĐÀ NẴNG

TRƢỜNG ĐẠI HỌC BÁCH KHOA TRUNG TÂM CÔNG NGHỆ THÔNG TIN ĐỊA LÍ GIỚI THIỆU PHẦN MỀM QUẢN LÝ MẠNG LƢỚI CẤP NƢỚC Thành phố Hồ Chí Minh, tháng 12/2018

Chương 1:

Phần 1: LÝ LUẬN CHUNG VỀ VỒN VÀ HIỆU QUẢ SỬ DỤNG VỐN KINH DOANH TRONG CÁC DOANH NGHIỆP

Kho Tàng Tâm Của Đấng Giác Ngộ

Thiền tông và Tịnh độ tông - chỗ gặp gỡ và không gặp gỡ

Microsoft Word - Decision 144_2010_UBND_.doc

BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƢỜNG ĐẠI HỌC NGOẠI THƢƠNG CỘNG HOÀ XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập - Tự do - Hạnh phúc KHUNG CHƢƠNG TRÌNH GIÁO DỤC ĐẠI HỌC

Hướng dẫn sử dụng Camera thông minh EZVIZ C6C Bước 1 : Kết nối Camera với phần mêm EZVIZ (ta có thể tham khảo phần thêm Camera vào trong phần EZVIZ) B

A DI ĐÀ KINH SỚ SAO DIỄN NGHĨA A DI ĐÀ KINH SỚ SAO DIỄN NGHĨA Liên Trì Đại Sư Chùa Vân Thê soạn Sớ Sao Pháp Sư Cổ Đức Diễn Nghĩa Giảng giải: Pháp Sư T

KỸ NĂNG GIAO TIẾP ỨNG XỬ Trong cuộc sống, trong giao tiếp hàng ngày con người luôn phải ứng phó với biết bao tình huống, có lúc dễ dàng xử lý, có lúc

73 năm trôi qua, thắng lợi của Cách mạng Tháng Tám đã cho thấy bài học đoàn kết, lấy dân làm gốc có ý nghĩa sâu sắc. Những ngày mùa Thu tháng Tám của

Hỗ trợ ôn tập [ĐỀ CƯƠNG CHƯƠNG TRÌNH ĐẠI HỌC] BÍ QUYẾT NGHIÊN CỨU KEYWORD HIỆU QUẢ Đây chính là bước đầu tiên bạn phải t

Phân tích nét tương đồng trong thơ Nguyễn Khuyến và Trần Tế Xương

HƯỚNG DẪN SỬ DỤNG ĐẦU GHI LILIN DVR 708/716/ Cấu tạo đầu ghi 1.1 Đầu ghi DVR 816 Mặt trước: Stt Tên Chức năng 1 Phím sang trái Di chuyển sang tr

ĐỀ cương chương trình đẠi hỌc

ĐỊNH HƯỚNG PHÂN CÔNG NHIỆM VỤ CÔNG TÁC CHO CÁN BỘ CỦA PHÒNG/ TRUNG TÂM

Microsoft Word - minh.doc

No tile

Học không được hay học để làm gì? Trải nghiệm học tập của thanh thiếu niên dân tộc thiểu số (Nghiên cứu trường hợp tại Yên Bái, Hà Giang và Điện Biên)

TÂM LÝ HỌC DÀNH CHO LÃNH ĐẠO TÂM LÝ HỌC DÀNH CHO LÃNH ĐẠO PSYCHOLOGY FOR LEADERS (Quản lý hiệu quả hơn nhờ cách thức tạo ra động lực, xung đột và quyề

Microsoft Word - phuong-phap-thuyet-minh.docx

Microsoft Word - IP Law 2005 (Vietnamese).doc

Nhúng mã-cách khai báo biến Nhúng mã-cách khai báo biến Bởi: Khoa CNTT ĐHSP KT Hưng Yên Nhúng mã javascript trong trang HTML Bạn có thể nhúng JavaScri

TRƯỜNG ĐẠI HỌC TÀI NGUYÊN VÀ MÔI TRƯỜNG HÀ NỘI KHOA QUẢN LÝ ĐẤT ĐAI Hoàng Ngọc Ánh ĐỒ ÁN TỐT NGHIỆP BIÊN TẬP CHUẨN HÓA BẢN ĐỒ ĐỊA CHÍNH BẰNG PHẦN MỀM

LIÊN MINH ĐẢNG CỘNG HOÀ Đảng của nhân dân nhằm thiết lập lại nền dân chủ HIẾN CHƯƠNG THÀNH LẬP Được thông qua trong hội nghị thành lập Liên minh Đảng

World Bank Document

Cúc cu

TRƢỜNG ĐẠI HỌC SÀI GÒN KHOA:SƢ PHẠM KHOA HỌC XÃ HỘI ĐHSG/NCKHSV_01 CỘNG HÕA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập Tự do Hạnh phúc Thành phố Hồ Chí Minh, n

BỘ CÔNG THƯƠNG -

Microsoft Word - HD SD CD T-88

A. Mục tiêu: CHƢƠNG I MỞ ĐẦU Số tiết: 02 (Lý thuyết: 02 bài tập: 0) 1. Kiến thức: Sinh viên hiểu đƣợc những kiến thức cơ bản nhƣ: đối tƣợng, nhiệm vụ

ĐỨC TIN LÀ GÌ? Đức tin có một tầm quan trọng hết sức cơ bản trong cuộc sống đời người, đặc biệt là người trẻ. Một số người tự nhiên có đức tin, cơ hồ

KINH THUYẾT VÔ CẤU XỨNG

Chương trình dịch

Phần vận dụngtt HCM HỌC KỲ II NĂM HỌC xem trong các tài liệu giáo trình TƯ TƯỞNG HỒ CHÍ MINH HOẶC WEB CỦA CÔ VÕ THỊ HỒNG

Bản ghi:

PHƢƠNG PHÁP SINH I. Khái niệm Phương pháp sinh được sử dụng trong bài toán liệt kê, ví dụ như người ta cần liệt kê tổ hợp chập k của n phần tử hay hoán vị của một tập số, hay khi người cần làm một bài toán mà không thể áp dụng các phương pháp thông minh như quy hoạch động, chia để trị thì phương pháp liệt kê để xét vét cạn là sự lựa chọn cuối cùng. Phương pháp sinh là phương pháp từ cấu hình đầu tiên ta sinh ra các cấu hình tiếp theo. Không phải bài nào cũng có thể làm theo phương pháp sinh, yêu cầu của bài toán để có thể làm theo phương pháp sinh là: - Thứ nhất phải xác định được cấu hình đầu và cấu hình cuối - Thứ hai phải xác định được cấu hình tiếp theo bằng 1 công thức nhất định Việc xác định cấu hình đầu tiên và cấu hình cuối cùng là do yêu cầu đặt ra của từng bài toán và do cách xác định của từng người lập trình. Yêu cầu quan trọng hơn khi sử dụng phương pháp sinh là làm sao từ cấu hình đang có ta có thể đưa ra được cấu hình tiếp theo hoặc là khẳng định đó là cấu hình cuối cùng. Ta tạm gọi bài toán từ cấu hình ban đầu sinh ra cấu hình tiếp theo có thủ tục là sinh_kế_tiếp. Khi đó bài toán sử dụng phương pháp sinh được viết như sau: Procedure Generate; <Xây dựng cấu hình ban đầu>; Stop := False; While not Stop Do <Đưa ra cấu hình đang có>; sinh_kế_tiếp; Trong thủ tục sinh_kế_tiếp, nếu cấu hình đang có là cuối cùng thì thủ tục này cần gán cho biến Stop giá trị True, ngược lại thủ tục này sẽ xây dựng cấu hình kế tiếp của cấu hình đang có trong thứ tự đã xác định. II. Áp dụng phƣơng pháp sinh vào giải một số bài toán. 1. Bài toán liệt kê tất cả các dãy nhị phân có độ dài N. Bài toán có thể được phát biểu như sau: Cho N là một số nguyên dương, hãy chỉ ra tất cả các dãy b 1, b 2,, b N với b i {0; 1}, (1 i N). Ví dụ với N = 3 ta có các dãy đó là:

1. 0 0 0 2. 0 0 1 3. 0 1 0 5. 1 0 0 6. 1 0 1 7. 1 1 0 4. 0 1 1 8. 1 1 1 Phân tích bài toán: Ta có thể thấy ngay dãy đầu tiên là 0 0 0 0 (dãy toàn số 0) và dãy cuối cùng là 1 1 1 1 (dãy toàn số 1). Từ cấu hình đang có thì cấu hình tiếp theo được xây dựng bằng cách cộng thêm 1 (cộng nhị phân) nếu ta cách biểu diễn cấu hình là biểu diễn nhị phân của một số nguyên. Ví dụ từ cấu hình 0 1 0 (2) thì cấu hình tiếp theo là 0 1 1 (3). Từ cấu hình đang có b 1, b 2,, b N ta có thể xây dựng cấu hình tiếp theo với qui tắc sau - Tìm i đầu tiên (theo thứ tự i = n, n-1,.. 1) thoã mãn bi = 0; - Gán lại bi = 1 và bj = 0 với tất cả j > i. Dãy mới thu được sẽ là dãy cần tìm. Ví dụ: Xét dãy nhị phân độ dài 10, b = 1001001111. + Ta tìm được i đầu tiên = 5. + Bây giờ ta gán b 5 =1 và b 6, b 7, b 8, b 9, b 10 1001010000 (tương ứng với 1001001111 (591) + 1 = 1001010000 (592)) Thuật toán sinh kế tiếp cho bài toán này được diễn tả như sau: Procedure Next_Bit_String; i := n; while bi = 1 do bi := 0; i := i -1; bi := 1; Chương trình của bài toán: Program Bai1; var n, i: integer; b: Array[1..20] of 0..1; count : word; stop : boolean;

Procedure init; var i: integer; Write('Do dai day nhi phan = '); readln(n); for i := 1 to n do b[i] := 0; stop := false; count := 0; Procedure Next_Bit_String; Var i: integer; i:=n; while (i>=1) and (b[i]=1) do b[i] := 0; i := i-1; if i < 1 then stop := True Else b[i] := 1; BEGIN init; While not (top) do Count := count + 1; Write(Count:5); For i := 1 to n do Write(b[i]:2); writeln; Next_Bit_String; Write('Bam phim Enter de thoat khoi Chuong trinh '); Readln; END. 2. Bài toán liệt kê các tập con m phần tử của tập n phần tử. Bài toán có thể phát biểu như sau: Cho tập hợp Cho X = {1, 2, 3,.., n}. Hãy liệt kê các tập con có m phần tử của X. Ví dụ: X= {1, 2, 3, 4, 5}, m= 3. Các tập con 3 phần tử của X là: 1. {1, 2, 3} 2. {1, 2, 4} 3. {1, 2, 5} 4. {1, 3, 4} 5. {1, 3, 5} 6. {1, 4, 5} 7. {2, 3, 4} 8. {2, 3, 5} 9. {2, 4, 5} 10. {3, 4, 5} Phân tích bài toán: Mỗi tập con m phần tử của X có thể biểu diễn bởi bộ có thứ tự gồm m thành phần a = {a 1, a 2,.., a m 1 < a 2 < a m n.

Ta thấy cấu hình đầu tiên là {1, 2, 3,, m} và cấu hình cuối cùng là {n-m+1, n- m+2,, n} Từ cấu hình đang có {a 1, a 2,.., a m } ta tìm cấu hình tiếp theo bằng cách: Ví dụ: - Tìm từ bên phải dãy a 1, a 2,, a 3 phần tử a i n-m+i; - Thay a i bởi a i +1; - Thay a j bởi a i + j i với j = i+1, i+2,, m. Với n = 6 và m = 4. Giả sử tập con đang có là {1, 2, 5, 6}, cần xây dựng tập con kế tiếp. + Ta tìm được i = 2 + Thay a 2 = 3 + Thay a 3 =4, a 4 = 5 => ta được tập con kế tiếp là {1, 3, 4, 5} Thuật toán sinh kế tiếp cho bài toàn này được diễn tả như sau: Procedure Next_Combination; i := m; while a i = n m + i do i := i - 1; a i := a i + 1; for j := i + 1 to n do a j := a i + j - i; Chương trình của bài toán được diễn tả như sau: Program tap_con; Var n, m,i : integer; a: Array[1..20] of integer; count: longint; stop : boolean; Procedure init; Var i : integer; Write('Moi nhap N '); Readln(n); Write('Moi nhap M '); Readln(m); For i:= 1 to m do a[i] := i; stop := false; count := 0; Procedure Next_Combination;

Var i, j: integer; i := m; while (i>0) and (a[i] = n-m+i) do i := i-1; if i = 0 then stop := True else a[i] := a[i]+1; for j := i+1 to m do a[j] := a[i]+j-i; BEGIN init; while not stop do count := count+1; Write(count:5); for i := 1 to m do write(a[i]:3); writeln; Next_Combination; Write('Bam Enter de ket thuc '); Readln End. 3. Bài toán liệt kê các hoán vị của tập n phần tử. Bài toán có thể phát biểu như sau: Cho X = {1, 2, 3,.., n}. Hãy liệt kê các hoán vị từ n phần tử của X. Ví dụ với n = 3 thì các hoán vị của nó là: Phân tích bài toán: 1. (1, 2, 3) 2. (1, 3, 2) 3. (2, 1, 3) 4. (2, 3, 1) 5. (3, 1, 2) 6. (3, 2, 1) Ta thấy ngay theo thứ tự trên thì cầu hình đầu tiên là: (1, 2, 3,.. n) và cấu hình cuối cùng là (n, n-1,..., 2, 1). Cần xây dựng thuật toán để từ cấu hình đang có là (a 1, a 2,, a n ) ta tìm được cấu hình tiếp theo. Từ cấu hình đang có {a 1, a 2,, a n } ta xây dựng cấu hình tiếp theo bằng qui tắc: - Tìm j đầu tiên thoả mãn a j <a j+1 (j giảm từ n, n-1,, 1); - Tìm a k là số nhỏ nhất và a k >a j trong các số a j+1, a j+2,, a n ; - Đỗi chỗ a j với a k ;

- Đảo ngược đoạn từ a j+1 đến a n. Ví dụ với n = 6, cấu hình đang có là (3, 6, 2, 5, 4, 1) + Ta tìm được j = 3 + Ta tìm được k = 5 + Hoán vị a 3 với a 6 ta được (3, 6, 4, 5, 2, 1) + Đảo ngược đoạn a 4, a 5, a 6 ta được (3, 6, 4, 1, 2, 5) Cấu hình tiếp theo là (3, 6, 4, 1, 2, 5) Chương trình của bài toán là: Program hoan_vi; Var a:array[1..100] of integer; n,i: integer; count: longint; stop : Boolean; Procedure init; var i: integer; Write('Moi nhap vao N '); Readln(n); For i := 1 to N do a[i]:=i; Stop := False; Count := 0; Procedure next_permution; Var j,k,l,m:integer; tg: integer; j := n-1; while (j >0) and (a[j] > a[j+1]) do dec(j); if j = 0 then stop := True else k := n; while a[j] > a[k] do dec(k); tg := a[j]; a[j] := a[k]; a[k] := tg; l := n; m := j+1; while l > m do

tg := a[l]; a[l] := a[m]; a[m] := tg; dec(l); inc(m); BEGIN init; while not stop do inc(count); write(count,'. '); For i := 1 to N do write(a[i]:3); writeln; next_permution; Write('Bam Enter de ket thuc '); Readln; END. 4. Bài toán phân tích số nguyên dƣơng N thành tổng các số nguyên không âm. Bài toán được phát biểu như sau: Cho một số nguyên dương N. Hãy liệt kê các cách phân tích N thành tổng các số nguyên không âm. Ví dụ với N = 4, ta có thể phân tích thành: 1. 4 Phân tích bài toán: 2. 3 + 1 3. 2 + 2 4. 2 + 1 + 1 5. 1 + 1 + 1 + 1 Ta có thể thấy ngay cấu hình đầu tiên là: N và cấu hình cuối cùng là 1 1 1 1 (N chữ số 1). Cần xây dựng thuật toán để từ cấu hình ta tìm được cấu hình tiếp theo. Từ cấu hình a 1, a 2,, a k ta có thể xây dựng cấu hình tiếp theo với quy tắc sau: - Tìm i đầu tiên sao cho a i 1 (i giảm từ k, k-1, 1) - Thay a i = a i -1 - Phân tích (k-i+1) thành các số như sư: + Gán a j :=a i với j từ i+1 đến i + [(i+ k-i+1) div a i ]; + Gán a j+1 := [(k-i+1) mod a i ] nếu [(k-i+1) mod a i ] <> 0

(Số phần tử được phân tích thành bây giờ là i + [(k-i+1) div a i ] + [(k-i+1) mod a i ] Ví dụ: Với N=10 *Từ cấu hình 4 4 1 1 (k=4) - Ta tìm được i = 2 - a 2 := a 2-1 (a 2 = 3) - ta có k-i+1 div a 2 = 1 và k-i+1 mod a 2 = 0 => số phần tử tiếp theo là 1 đó là a 3 = a 2 (a 3 = 3) => Cấu hình tiếp theo là: 4 3 3 *Từ cấu hình 4 3 3 (k=3) - Ta tìm được i =3 - a 3 := a 3-1 (a 3 = 2) - Ta có k-i+1 div a 3 = 0 và k-i+1 mod a 2 = 1 => số phần tử tiếp theo là 1 đó là a 4 = 1 => Cấu hình tiếp theo là: 4 3 2 1 Chương trình của bài toán là: Program phan_tich; Var c: array[1..1000] of integer; k, n: integer; count: longint; Stop: Boolean; Procedure init; Var i,j:integer; Write('Moi nhap so nguyen duong N '); Readln(N); k := 1; c[k] := n; Count := 0; Stop := False; Procedure Result; Var i: integer; inc(count); Write(count,'. '); For i := 1 to k do write(c[i]:3); writeln;

Procedure Next_Division; Var i, j, r, s, d : integer; i := k; while (i>0) and (c[i] =1) do dec(i); if i>0 then c[i] := c[i]-1; d := k-i+1; r := d div c[i]; s := d mod c[i]; k := i; if r>0 then for j := i+1 to i+r do c[j]:=c[i]; k := k+r; if s>0 then k := k+1; c[k] := s; end else stop := True; Procedure Division; Var i: integer; While not stop do result; next_division; Write('Bam Enter de ket thuc '); Readln BEGIN init; division; END.

Như vậy, với mỗi bài toán như trên, khi sử dụng phương pháp sinh vào giải quyết chúng ta thường gặp khó khăn như sau: một là việc xác định cấu hình đầu tiên và cấu hình cuối cùng, hai là việc xác định được quy tắc để từ cấu hình đang có ta tìm ra được cấu hình tiếp theo (sinh ra cấu hình tiếp theo). Chính vì nguyên nhân đó mà phương pháp sinh không được sử dụng rộng rãi vào giải quyết các bài toán như thuật toán quay lui, quy hoạch động, Phương pháp sinh chỉ được sử dụng vào giải quyết một số bài toán liệt kê các cấu hình tổ hợp đơn giản. Hoàng Thị Minh Huyền