Thông tin tài liệu
PHƯƠNG PHÁP SINH Nội dung Bài toán tổ hợp Phương pháp sinh Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT Bài toán Cho tập hợp gồm n phần tử X = { X1, X2, , Xn } Hãy liệt kê tất tập tập Các tập gồm có : { X1 } , { X1, X2 } , { X1, X3 }, { X1,X2, ,Xn } Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT Phân tích tốn Để biểu diễn tập Y X Ta dùng xâu nhị phân Bn = { B1,B2, ,Bn } cho Bi = Xi Y, ngược lại Bi = Xi Y Ví dụ dãy 0011 Thể cho tập Y = {X3, X4} phần tử B3 B4 có giá trị Khi để giải tốn liệt kê tất tập X, ta quy toán liệt kê tất xâu nhị phân có kích thước n Số xâu nhị phân 2n Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT Nhận xét Một dãy nhị phân x độ dài n VD: x = 101111 n=6 Là biểu diễn số nguyên p(x) đoạn [0, 2n-1] Do số dãy nhị phân độ dài n số số nguyên [0, 2n-1] = 2n Mục tiêu tốn lập chương trình liệt kê dãy nhị phân n phần tử theo thứ tự từ điển, có nghĩa liệt kê dãy nhị phân biểu diễn số nguyên theo thứ tự 0, 1, , 2n-1 Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT Ví dụ n = 6: Dãy có: Cộng thêm 1: Dãy mới: 010000 +1 010001 Dãy có: 010111 Cộng thêm 1: Dãy mới: +1 011000 Kỹ thuật sinh cấu hình từ cấu hình mơ tả sau: - Xét từ cuối dãy lên tìm số - Nếu tìm thấy thay số số đặt tất phần tử phía sau vị trí - Nếu khơng tìm thấy dãy chứa tồn số 1, cấu hình cuối Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT Chương trình minh họa 1: int stop; // biến toàn cục void Next_BS(int B[MAX], int n) // Hàm phát sinh chuỗi { int i = n; // duyệt từ cuối while ( i>0 && B[i] ) // lặp chưa tìm thấy B[i] ==0 { B[i] = 0; // gán bit sau i ; // giảm trước 10 } 11 if (i==0 ) stop = 1; // cấu hình cuối nên khơng tìm // B[i] = -> dừng 12 else 13 B[i] = 1; // gán cho B[i] 14 } Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT void Generate( int B[MAX], int n ) // Hàm sinh chuỗi nhị phân { Stop = 0; while (! Stop) { Result(B,n); // xuất chuỗi nhị phân Next_BS(B,n); // chuỗi nhị phân } } void Result ( int B[MAX], int n ) { int count=0; printf (“\n Xau nhi phan thu %d”, ++count ) ; for( int i=0; i < n; i++ ) printf(“%3d”, B[i]); } Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT int main() { int i, B[MAX], n ; printf( “ Nhap n: ”); scanf(“%d”,&n); for(i=0; i< n; i++) B[i] =0; Generate(B, n); getch(); return 0; } Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT Bài tốn tổ hợp Có n biến x1, x2, x3, , xn Mỗi biến xi mang trị thuộc tập hợp Pi Miền trị tốn tập tích P1 x P2 x P3 x x Pn Phép gán trị (assignment): Là trị a1, a2, a3, , an Trong xi Pi Một lời giải toán phép gán trị Một phép gán trị gọi cấu hình Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT 10 Bài toán tập k-phần tử Tập đầu: { 1,2,3, ,k } Thí dụ { 1,2,3 } với k=3, n=5 Tập cuối:{ (n-k+1), (n-k+2) , , n } Thí dụ: { 3,4,5 } với k=3, n=5 Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT 34 Bài toán tập k-phần tử Cách sinh tập từ tập có a1 a2 a3 a4 ak , số từ (1) Tìm vị trí từ bên phải vị trí i cho a[i] ≠ n-k+i i=k; while (a[i]==n-k+i) i ; (2) Thay a[i] a[i] +1 a[i]= a[i] + 1; (3) Thay trị sau i (a[j]) trị a[i]+j-i , for (j=i+1;j= số sau Ngược thứ tự từ điển Tại thời điểm, số phần tử k Bắt đầu: k=1, kết thúc: k=n Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT 61 52 511 43 421 4111 331 322 3211 31111 2221 22111 211111 1111111 39 Bài toán chia số nguyên n= 20 , trạng thái k=15 541111111111111 //số phải giảm 4, số >1 từ bên phải, vị trí i=2 //với số từ 1, giảm trị đơn vị 53 // số trị phải chia lại 14 = số trị bên phải +1 //= k-i+1=15-2+1=14 //Số chia từ a[2]=3, 14/3 lần trị thêm vào // 3, dư 3 3 ( k=i+SốLầnBằngTrị) 3 3 //thêm phần dư vào cuối (k++) Đây trạng thái kế tiếp- xong Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT 40 Bài toán chia số nguyên Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT 41 Bài tốn chia số ngun Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT 42 Bài toán chia số nguyên Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT 43 Bài tốn chia số ngun Thêm dịng: delete[ ] vars; Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT 44 Bài tốn chia số ngun Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT 45 Xin cám ơn Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT 46 Tài liệu tham khảo Giáo trình mơn học kỹ thuật lập trình nâng cao – Ths Nguyễn Hà Giang Slide Kỹ thuật lập trình nâng cao – Ths Thân Văn Sử Slide Kỹ thuật lập trình nâng cao – GV Mai Ngọc Thu Slide Kỹ thuật lập trình nâng cao –Ths Văn Thiên Hồng Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT 47 Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT 48 ... k =1, kết thúc: k=n Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT 61 52 511 43 4 21 411 1 3 31 322 3 211 311 11 22 21 2 211 1 211 111 11 111 11 39 Bài toán chia số nguyên n= 20 , trạng thái k =15 5 411 111 111 111 11. .. 0000 00 01 0 010 0 011 010 0 010 1 011 0 011 1 p(b) vars 10 00 10 01 1 010 10 11 110 0 11 01 111 0 11 11 Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT p(b) 10 11 12 13 14 15 Với thứ tự từ điển, tập sau lớn tập... theo thứ tự 0, 1, , 2n -1 Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT Ví dụ n = 6: Dãy có: Cộng thêm 1: Dãy mới: 010 000 +1 010 0 01 Dãy có: 010 111 Cộng thêm 1: Dãy mới: +1 011 000 Kỹ thuật
Ngày đăng: 01/08/2020, 02:28
Xem thêm: