Tải bản đầy đủ (.pdf) (22 trang)

Vận dụng phương pháp sinh để giải một số bài toán liệt kê tổ hợp theo thứ tự từ điển

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (790.18 KB, 22 trang )

MỤC LỤC
 I­ Sơ lược lý lịch tác giả:                                                                                             
 
............................................................................................
   
 2
 II. Sơ lược đặc điểm tình hình đơn vị:                                                                     
 
....................................................................
   
 2
 III. Mục đích u cầu của giải pháp:                                                                         
 
........................................................................
   
 3
 1. Thực trạng ban đầu trước khi áp dụng giải pháp                                                 
 
................................................
   
 3
 2. Sự cần thiết phải áp dụng giải pháp                                                                     
 
....................................................................
   
 3
 3. Nội dung giải pháp                                                                                                 
 
...............................................................................................
   
 4


 3.1. Tiến trình thực hiện                                                                                         
 
........................................................................................
   
 4
 3.2. Thời gian thực hiện:                                                                                        
 
......................................................................................
   
 4
 3.3 Biện pháp tổ chức                                                                                             
 
............................................................................................
   
 4
 IV. Hiệu quả của giải pháp                                                                                      
 
.....................................................................................
    
 20
  V. Mức độ ảnh hưởng:                                                                                            
 
..........................................................................................
    
 20
 VI. Kết luận                                                                                                                
 
...............................................................................................................
    
 20

 1. Những bài học kinh nghiệm                                                                                 
 
................................................................................
    
 20
   2. Những kiến nghị, đề xuất                                                                                  
 
.................................................................................
    
 21
 TÀI LIỆU THAM KHẢO                                                                                          
 
.........................................................................................
    
 22

1


 SỞ GD&ĐT AN GIANG
TRƯỜNG THPT AN PHÚ

CỘNG HỊA XàHỘI CHỦ NGHĨA VIỆT NAM
Độc lập ­ Tự do ­ Hạnh phúc
         An Giang, ngày 24 tháng 12 năm 2018

BÁO CÁO 
Kết quả thực hiện sáng kiến, cải tiến, giải pháp kỹ thuật, quản lý, tác 
nghiệp, ứng dụng tiến bộ kỹ thuật hoặc nghiên cứu khoa học sư phạm ứng 
dụng


I­ Sơ lược lý lịch tác giả:
­ Họ và tên: Nguyễn Phi Hùng.  Nam, nữ: Nam.
­ Ngày tháng năm sinh: 19/09/1986.
­ Nơi thường trú: xã Vĩnh Hội Đơng, huyện An Phú, tỉnh An Giang.
­ Đơn vị cơng tác: Trường THPT An Phú.
­ Chức vụ hiện nay: Tổ phó chun mơn.
­ Lĩnh vực cơng tác: giáo viên Tin học.
II. Sơ lược đặc điểm tình hình đơn vị:
* Thuận lợi
 
Được sự  quan tâm cua S
̉ ở  GD&ĐT An Giang, sự  hơ tr
̃ ợ  tich c
́ ực cua câp 
̉
́ ủy  
va chinh quyên đia ph
̀ ́
̀ ̣
ương, sự đoan kêt, quyêt tâm nâng cao chât l
̀ ́
́
́ ượng giao duc cua
́ ̣
̉  
tâp thê cán b
̣
̉
ộ, giáo viên, nhân viên và học sinh trường THPT An Phú. Ban Châṕ  

hanh Đang bô, Ban Th
̀
̉
̣
ương vu Đang 
̀
̣
̉ ủy đa th
̃ ực hiên tôt công tac lanh đao và đat
̣
́
́ ̃
̣
̣ 
nhiêu thanh tich nơi bât. 
̀
̀ ́
̉ ̣
 
Cơng tác chun mơn ln được lãnh đạo nhà trường quan tâm chỉ đạo: nâng  
cao chât l
́ ượng giao viên, nâng cao trinh đơ chun mơn; tiêp tuc đơi m
́
̀
̣
́ ̣
̉ ới phương 
phap giang day va phát huy kh
́
̉

̣
̀
ả năng tự học, trải nghiệm sáng tạo của hoc sinh …
̣
* Khó khăn
Nhà trường có kế  hoạch bồi dưỡng học sinh giỏi từ  đầu năm nhưng thời  
gian ơn tập khơng nhiều, phần lớn là các em tự học.
Tuy được đào tạo đúng chun ngành nhưng giáo viên giảng dạy tin học 
trong nhà trường phần lớn là giáo viên trẻ, chưa có nhiều kinh nghiệm trong việc  
bồi dưỡng học sinh giỏi.
2


Tuy u thích mơn học nhưng tâm lý học sinh vẫn xem tin học là mơn phụ 
chưa có vị trí quan trọng. Bên cạnh phụ huynh học sinh vẫn chưa thấy được xu thế 
và tầm quan trọng của cơng nghệ  thơng tin (CNTT) nên khơng đầu tư  nhiều cho 
con em trong vấn đề này.
* Tên báo cáo giải pháp: “Vận dụng phương pháp sinh để  giải một số  bài  
tốn liệt kê tổ hợp theo thứ tự từ điển”.
* Lĩnh vực: Chun mơn.
III. Mục đích u cầu của giải pháp:
1. Thực trạng ban đầu trước khi áp dụng giải pháp
Trong thời đại ngày nay, thế  giới đang diễn ra q trình tin học hóa trong  
nhiều lĩnh vực hoạt động của xã hội. Tin học phát triển nhanh như vũ bão và đã trở 
thành một ngành khoa học đóng vai trị quan trọng khơng thể thiếu đối với sự phát  
triển của xã hội.
Trong những năm gần đây, các em học sinh từ  cấp tiểu học cho đến phổ 
thơng đã được trang bị những hiểu biết ban đầu về máy tính, biết được lợi ích của 
máy tính trong đời sống và học tập.Việc học sinh tiếp cận với tin học đã tạo nền  
tảng cơ sở ban đầu để định hướng cho các em có sở thích và năng khiếu nghiên cứu  

khoa học theo ngành khoa học cơng nghệ cao.
Mơn tin học giúp học sinh bước đầu làm quen với phương pháp giải quyết 
vấn đề theo quy trình cơng nghệ và kỹ năng sử  dụng máy tính phục vụ học tập và 
cuộc sống. Tin học có ý nghĩa to lớn đối với sự phát triển trí tuệ, tư duy thuật tốn,  
góp phần hình thành học vấn phổ thơng cho học sinh.
Qua thực tế  giảng dạy mơn Tin học tại trường THPT An Phú, nhất là trong 
cơng tác bồi dưỡng học sinh giỏi, bản thân ln suy nghĩ làm thế  nào để  các em  
tiếp cận một cách tốt nhất, dễ  hiểu nhất với các thuật tốn. Chính vì thế  tơi ln 
chú trọng đến việc phân tích và hướng dẫn giải thuật để các em có thể  vận dụng 
và giải bài tốn  theo phương pháp hiệu quả nhất.
2. Sự cần thiết phải áp dụng giải pháp
Nhiều quốc gia ý thức được tầm quan trọng của tin học và có những đầu tư 
lớn vào lĩnh vực này đặc biệt là lĩnh vực giáo dục nhằm đào tạo một đội ngũ tri 
thức trẻ có nền tảng tin học vững vàng nhằm đáp ứng nhu cầu ngày càng cao của 
xã hội. Việc đưa tin học vào giảng dạy tại các trường từ cấp Tiểu Học đến THPT  
nhằm mục đích phổ  cập các kiến thức cơ  bản về  Tin học, ngồi ra cịn giúp học  
sinh có khả  năng phân tích, tổng hợp, trừu tượng hóa, khái qt hóa vấn đề, đặc 
biệt là phát triển khả năng tư duy. Muốn vậy ngồi việc dạy đại trà, hướng nghiệp  
và dạy nghề cần tạo điều kiện cho học sinh có năng khiếu tin học được phát triển  
khả năng lập trình để giải quyết tốt các bài tốn.
3


Để có thể phát huy những tài năng tin học thơng qua ơn luyện đội tuyển học  
sinh giỏi, địi hỏi người dạy phải tiếp cận với nhiều dạng bài tốn khó và nắm  
vững các phương pháp giải quyết bài tốn đó. Bài tốn trong tin học thường rất đa  
dạng và phức tạp, mỗi bài tốn có thể có nhiều phương pháp giải khác nhau. Để có 
thể lựa chọn phương pháp thích hợp cho bài tốn, chúng ta có thể phân chia các bài 
tốn thành các dạng bài tốn tổng quan và chỉ ra phương pháp giải phù hợp.
Bài tốn liệt kê là một trong những lớp bài tốn khó, có nhiều phương pháp 

giải lớp bài tốn này và một trong những cách giải hiệu quả và phù hợp nhất là sử 
dụng Phương pháp sinh. Chính vì vậy nên tơi chọn đề tài: “Vận dụng phương pháp  
sinh để giải một số bài tốn liệt kê tổ hợp theo thứ tự từ điển”  trong ơn luyện học 
sinh giỏi mơn Tin học.
3. Nội dung giải pháp 
3.1. Tiến trình thực hiện
Thơng thường, để giải một bài tốn theo một phương pháp bất kì, tơi thường  
hướng dẫn học sinh tiếp cận theo quy trình sau:
Đọc và phân 
tích đề

Viết chương 
trình

Thiết kế 
thuật tốn

Kiểm thử

3.2. Thời gian thực hiện: 
Giải pháp được áp dụng trong q trình bồi dưỡng học sinh giỏi từ  năm  
2017­2018 đến nay.
3.3 Biện pháp tổ chức
Trong q trình giải bài tập, để  giải được bài tốn dạng liệt kê tổ  hợp theo  
thứ tự từ điển bằng Phương pháp sinh thì phải thỏa mãn hai điều kiện sau:
­ Từ u cầu của đề bài, ta phải xác định được cấu hình đầu tiên và cấu 
hình cuối cùng;
­ Từ cấu hình đang có, nếu chưa phải là cấu hình cuối cùng ta phải xây 
dựng được thuật tốn để sinh cấu hình tiếp theo.
Phương pháp sinh có thể được mơ tả như sau:


4


* Một số ký hiệu được dùng trong lưu đồ thuật tốn:

Trong đề tài này, tơi xin trình bài ba dạng tốn cơ bản có thể sử dụng 
Phương pháp sinh để xử lí:

5


Ví dụ: 
Dạng 1: Liệt kê dãy nhị phân có độ dài n NHIPHAN.INP NHIPHAN.OUT
000
Input:   nhập   từ   file   văn   bản  3
001
NHIPHAN.INP chứa số nguyên dương n (3<=n 
010
< =30) 
011
Output:   ghi   ra   file   văn   bản 
100
NHIPHAN.OUT các dãy nhị phân độ dài n, mỗi 
101
dãy nằm trên một dịng.
111

Một dãy nhị  phân độ  dài n là một dãy A = A1A2...An  trong đó Ai  € {0, 1}
(  i : 1 ≤ i  ≤ n). Như vậy dãy đầu tiên sẽ là 00...0 (gồm n phần tử có giá trị 0) và  

dãy cuối cùng sẽ là 11…1 (gồm n phần tử có giá trị 1). Nhận xét rằng nếu dãy A =  
(A1, A2, …, An) là dãy đang có và khơng phải dãy cuối cùng thì dãy kế tiếp sẽ nhận  
được bằng cách cộng thêm 1 ( theo cơ  số  2 ) vào dãy hiện tại. Như  vậy kỹ  thuật  
sinh cấu hình kế tiếp từ cấu hình hiện tại có thể mơ tả như sau: Xét từ cuối dãy về 
đầu (xét từ phải sang trái), gặp số 0 đầu tiên thì thay nó bằng số 1 và đặt tất cả các 
phần tử phía sau vị trí đó bằng 0.
Thuật tốn sinh có thể mơ tả như sau:
Sinh cấu hình đầu {Gán A[i]:=0 với i tăng từ 1 đến n}
Repeat
Xuất cấu hình hiện tại  {in A[i] với i tăng từ 1 đến n}
Tìm từ cuối dãy về trước ­ vị trí A[i] = 0
Nếu chưa hết dãy (i > 0) thì:
+ A[i]:=1;// Vị trí vừa tìm được
                     + Gán các phần tử từ vị trí i+1 về sau bằng 0
Until i = 0;

6


Thuật tốn chi tiết:

Chương trình tham khảo
const fi= ‘NHIPHAN.INP';
fo= ‘NHIPHAN.OUT';
Sai
var n: integer;
A: array[1..30] of integer;
procedure Nhap;
begin
read(n);

end;
Đúng
procedure xuli;
var i,j: integer;
begin
//Sinh cấu hình đầu
for i:=1 to n do A[i]:=0;
Đúng
repeat
//Xuất cấu hình hiện tại
for i:=1 to n do write(A[i]);
Sai
writeln;
//Tìm vị trí A[i] =0
i:=n;
while (i>0) and (A[i]=1) do dec(i);
//Nếu chưa là cấu hình cuối cùng thì sinh cấu hình
//tiếp theo
if i>0 then
begin
A[i]:=1;
7


for j:=i+1 to n do A[j]:=0;
end;
until i=0;
end;
begin
assign(input, fi); reset(input);

assign(output, fo); rewrite(output);
nhap;
xuli;
close(input); close(output);
end.

Dạng 2: Liệt kê các tổ hợp chập k của n 
phần tử

Ví dụ: 
TOHOP.INP TOHOP.OUT
5 3
1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
3 4 5

Input: file văn bản TOHOP.INP chứa hai số 
ngun dương n, k (1 < k < n < 30) cách nhau ít 
nhất một dấu cách.
Output: file văn bản TOHOP.OUT các tập 
con k phần tử  của tập {1, 2, …, n}, mỗi tập con  
trên một dịng.

Ta dễ dàng xác định được cấu hình đầu tiên và cấu hình cuối cùng:

+ Cấu hình đầu: {1, 2, …,k}
+ Cấu hình cuối: {n­k+1, n­k+2, …,n}.Giá trị lớn nhất của phần tử thứ i là: 
n­k+i (  i : 1 <= i <= K) gọi là giới hạn trên của phần tử thứ i trong mỗi cấu hình).
Như vậy nếu ta đang có một dãy A đại diện cho một tập con, nếu A là cấu  
hình kết thúc có nghĩa là tất cả các phần tử trong A đều đã đạt tới giới hạn trên thì 
q trình sinh kết thúc, nếu khơng thì ta phải sinh ra một dãy A mới  tăng dần thỏa 
mãn vừa đủ  lớn hơn dãy cũ theo nghĩa khơng có một tập con k phần tử  nào chen  
giữa chúng khi sắp thứ tự từ điển.
Ví dụ: n = 7, k =5 và cấu hình đang có A = {1, 2, 5, 6,7}. Các phẩn tử A3 đến 
A5 đã đạt tới giới hạn trên nên để  sinh cấu hình mới ta khơng thể  sinh bằng cách  
tăng một phẩn tử trong số các A5, A4, A3  lên được, ta phải tăng A2 = 2 lên thành A2 
= 3. Được cấu hình mới là A = {1, 3, 5, 6, 7}. Cấu hình này đã thỏa mãn lớn hơn 
cấu hình trước nhưng chưa thỏa mãn tính chất vừa đủ lớn, muốn vậy ta lại thay A 3, 
A4, A5 bằng giá trị trước nó +1 nghĩa là:
Xét từ sau ra trước

Cấu hình hiện 
tại của A

1
1

2
2
8

3
5

4

6

5
7

Đạt tới  giới hạn
(n­k+i)


Chưa đạt 
gới giạn

Cấu hình kế tiếp 
của A

1
1

2
3

3
4
+1

4
5
+1

5

6
+1

Phương pháp sinh có thể mơ tả như sau:
Sinh cấu hình đầu {Gán A[i]:=i với i tăng từ 1 đến k}
Repeat
Xuất cấu hình hiện tại  {Xuất A[i] với i tăng từ 1 đến k}
Tìm từ cuối dãy về trước ­ vị trí A[i] chưa đạt giới hạn n –k + i
Nếu chưa hết dãy (i > 0) thì:
+ A[i]:=A[i]+1;
+ A[j]:=A[j­1] +1 với j tăng từ i+1 đến k
Until i = 0;
Thuật tốn chi tiết:

9


Sai

Đúng

Đúng

Sai

Chương trình tham khảo
const fi='TOHOP.INP';
fo='TOHOP.OUT';
var n, k: integer;
A: array[1..30] of integer;

procedure nhap;
begin
read(n,k);
end;
procedure xuli;
var i, j: integer;
begin
for i:=1 to k do A[i]:=i;
repeat
for i:=1 to k do write(A[i]);
writeln;
i:=k;
while (i>0) and (A[i]= n-k+i) do dec(i);
if i>0 then
begin
A[i]:=A[i]+1;
for j:=i+1 to n do A[j]:= A[j-1]+1;
end;
until i=0;
end;
begin
assign(input, fi); reset(input);
10


assign(output, fo); rewrite(output);
nhap;
xuli;
close(input);close(output);
end.


Ví dụ: 
Dạng 3: Liệt kê các hốn vị của n phần tử
HV.INP
Input: file văn bản HV.INP chứa số  ngun  3
dương n < 12.

HV.OUT
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

Output: file văn bản HV.OUT các hốn vị của 
dãy (1, 2, ..., n), mỗi hốn vị trên một dịng.

Ở  dạng tốn này, ta dễ  dàng xác định cấu hình đầu tiên và cấu hình cuối 
cùng của nó:
­ Cấu hình đầu: {1, 2, 3 …,n}
­ Cấu hình cuối: {n, n­1, n­2,…, n}
Nhận xét:  nếu ta đang có một dãy A đại diện cho một tập con, nếu A là cấu  
hình kết thúc có nghĩa là tất cả các phần tử  trong A phải có giá trị  giảm dần, nếu  
khơng thì ta phải sinh ra một dãy A mới thỏa mãn vừa đủ lớn hơn dãy cũ theo nghĩa  
khơng có một tập A* (A* là một hốn vị của tập A) chen giữa chúng khi sắp thứ tự 
từ điển.
Giả  sử  hốn vị  hiện tại là A = (3, 2, 6, 5, 4, 1), xét 4 phần tử  cuối cùng, ta 
thấy chúng được xếp giảm dần, điều đó có nghĩa là cho dù ta có hốn vị 4 phần tử 
này thế nào, ta cũng được một hốn vị bé hơn hốn vị hiện tại. Như vậy ta phải xét 

đến x2 = 2, thay nó bằng một giá trị khác. Ta sẽ thay bằng giá trị nào? khơng thể là 
1 bởi nếu vậy sẽ được hốn vị nhỏ hơn, khơng thể là 3 vì đã có A1 = 3 rồi (phần tử 
sau khơng được chọn vào những giá trị mà phần tử trước đã chọn). Cịn lại các giá 
trị 4, 5, 6. Vì cần một hốn vị vừa đủ lớn hơn hiện tại nên ta chọn A2 = 4. Cịn các 
giá trị (A3, A4, A5, A6) sẽ lấy trong tập {6, 5, 2, 1}. Cũng vì tính vừa đủ lớn nên ta sẽ 
tìm biểu diễn nhỏ nhất của 4 số này gán cho A 3, A4, A5, A6 tức là (1, 2, 5, 6). Vậy  
hốn vị mới sẽ là (3, 4, 1, 2, 5, 6), nghĩa là:
Giá trị tăng dần

Cấu hình hiện tại 
của A

1
3

2
2
11

3
6

4
5

5
4

6
1



Ta có cấu hình kế tiếp:
­ Tại vị trí A2 khơng hợp quy luật tăng dần tính từ  sau ra trước nên cần đổi: 
tìm từ  vị trí cuối cùng về  trước, nếu gặp phần tử  nào vừa lớn hơn A2 thì đổi chỗ 
với A2, ta tìm được A5. Vậy cần đổi chỗ A2 và A5. Ta được:
1
3

2
4

3
6

4
5

5
2

6
1

­ Để đảm bảo thứ tự từ điển, thì các phần tử từ A3 đến A6 phải tăng dần vì 
vậy cần phải đảo ngược giá trị của các phần tử này (Vì đoạn từ A 3 đến A6 là giảm 
dần).
x
123456346521


 

y

­ Vị trí các phần tử cần đảo vị trí là từ 3 đến 6 (gọi vị trí 3 là  x,  6 là y). Ta 
cần đổi chỗ Ax và Ay với x tăng dần, y giảm dần và q trình sẽ kết thúc khi x>=y.

Đổi 
chổ A3, 

1
3

2
4

x

3
1

A6

Đổi 
chổ A4, 
A5

1
3


2
4

3
1

4
5
x

4
2

5
2
y

5
5

y

6
6
6
6

Phương pháp sinh có thể mơ tả như sau:
Sinh cấu hình đầu {Gán A[i]:=i với i tăng từ 1 đến n}
Repeat

Xuất cấu hình hiện tại  {Xuất A[i] với i tăng từ 1 đến n}
Tìm từ cuối về trước­ vị trí A[i] khơng thỏa tính chất tăng dần
          Nếu chưa hết dãy (i > 0) thì:
          
A[i]

+ Tìm từ  cuối dãy về  trước – vị  trí A[k] >A[i] rồi đổi chỗ  A[k] và  
           + Đảo ngược đoạn cuối từ vị trí i+1 đến n
12


Thuật tốn chi tiết:

Sai

Sai

Sai

Chương trình tham khảo
const fi='HV.INP;
fo='HV.OUT';
Var n: integer;
A: array[1..20] of integer;
procedure nhap;
begin
read(n);
end;
procedure doicho(var x, y: integer);
var tam: integer;

begin
tam:=x;
x:=y;
y:=tam;
end;
procedure xuli;
var i, k, x, y: integer;
begin
for i:=1 to n do A[i]:=i;
repeat
for i:=1 to n do write(A[i]);
writeln;
i:=n-1;
while (i>0) and (A[i]>A[i+1]) do dec(i);
if i>0 then
begin
13


k:=n;
while A[k]doicho(A[i], A[k]);
x:=i+1; y:=n;
while xbegin
doicho(a[x], a[y]);
inc(x);
dec(y);
end;
end;

until i=0;
end;
begin
assign(input, fi); reset(input);
assign(output, fo); rewrite(output);
nhap;
xuli;
close(input); close(output);
end.

* Một số bài tập áp dụng
Bài tập 1:  Liệt kê dãy nhị  phân có độ  Ví dụ: 
dài  n.  Trong   đó  các   chữ   số  ‘01’    xuất  hiện  PT0101.INP
6
đúng 2 lần.
Input: nhập từ file văn bản PT0101.INP 
chứa số nguyên dương n (4 < n < =30) 
Output:   ghi   ra   file   văn   bản 
PT0101.OUT các dãy nhị  phân độ  dài n, mỗi 
dãy trên một dịng.

PT0101.OUT
110101
101101
011101
101011
011011
010111
010101
001101

010101
001011
010011
010101

Hướng dẫn: u cầu của đề  là n>4 và các số  ‘01’ xuất hiện đúng 2 
lần. Vậy để tiết kiệm chi phí chỉ cần sinh nhị phân n­4 phần tử. Ví dụ: n= 8 thì chỉ 
cần sinh nhị  phân 4 phần tử  và kết hợp ‘0101’ là 8 phần tử. Do các số  ‘01’ xuất 
hiện đúng 2 lần nên việc sinh 4 phần tử cịn lại được xác định như sau:
­ Cấu hình đầu: {1, 1, 1, 1}
14


­ Cấu hình cuối:{0, 0, 0, 0}
­ Sinh cấu hình kế  tiếp: Tìm từ  cuối dãy về  trước, gặp phần tử  bằng 1 ta 
chuyển về  0.  Vậy các cấu sẽ  sinh ra trong trường hợp này là: 1111, 1110, 1100, 
1000, 0000 (đảm bảo tính chất khơng có số  “01” nào xuất hiện). Tương  ứng mỗi 
cấu hình ta tìm cách sinh ra cấu hình mới kết hợp với ‘0101’ nghĩa là từ 1 cấu hình 
1111 ta sẽ  có các cấu hình tương  ứng: 11110101; 11101101; 11011101; 10111101; 
01111101;   11101011;   11011011;   10111011;  01111011;   11010111;   10110111; 
01110111; 10101111; 01101111; 01011111
n:=n­4;
Sinh cấu hình đầu {Gán A[i]:=1 với i tăng từ 1 đến n}
i:=n;
Repeat
Sinh các cấu hình: dựa vào cấu hình hiện tại, kết hợp “01” “01”
 A[i]:=0;
           Dec(i);
Until i < 0;
Bài   tập   2:  Trong   một   nhóm   có   n   học 

sinh, giáo viên muốn chọn ra k học sinh trong số  Ví dụ: 
n học sinh để  nghiên cứu và báo cáo về  một  NHOM.INP NHOM.OUT
Lan Tung 
chun đề  bài học. Hãy giúp giáo viên đưa ra  5 2
Lan
Lan Cuc 
các phương án lựa chọn thích hợp.
Tung
Lan Chuc 
Input: file văn bản NHOM.INP gồm
Lan Mai 
+ Dịng đầu chứa hai số ngun dương n,  Cuc
Tung Cuc 
k (1 < k < n < 30) cách nhau ít nhất một dấu  Chuc
Mai
Tung Chuc 
cách.
Tung Mai 
          + n dịng tiếp theo, mỗi dịng là tên một  
Cuc Chuc 
học sinh
Cuc Mai 
Output: file văn bản NHOM.OUT liệt kê 
Chuc Mai
các phương án lựa chọn k học trong n học sinh,  
Ví dụ: 
mỗi phương án trên một dịng.
XAU.INP
XAU.OUT
Hướng dẫn:  tương tự  sinh tổ  hợp chập k  ABABB

AABBB
của n phần tử 
ABABB
  
Bài tập 3: Nhập vào một xâu văn bản. In ra 
các hoán vị khác nhau của xâu theo thứ tự từ điển. 

15

ABBAB
ABBBA
BAABB
BABAB
BABBA
BBAAB
BBABA
BBBAA


Input: file văn bản XAU.INP gồm một dịng duy nhất là xâu văn bản cần tìm 
các hốn vị khác nhau của nó.
Output: file văn bản XAU.OUT liệt kê các hốn vị  khác nhau của xâu gốc,  
mỗi hốn vị nằm trên một dịng.
Hướng dẫn: Dạng bài liệt kê hốn vị nhưng xử lí trên xâu
­ Cấu hình đầu: để  có được cấu hình đầu ta phải sắp xếp xâu theo thứ  tự 
tăng dần của các kí tự “AABBB”
­ Cấu hình cuối là ngược lại so với cấu hình đầu “BBBAA”
­ Điểm khác so với hốn vị trên số là sẽ  có các kí tự giống nhau, khi đổi chỗ 
hai kí tự này cho nhau thì vơ nghĩa – giống cấu hình cũ. Vì vậy nếu muốn đổi chỗ 
hai kí tự này thì chúng phải khác nhau.

Vậy phương pháp sinh có thể mơ tả như sau:
Sắp xếp xâu gốc(S) để được cấu hình đầu tăng dần
Repeat
Xuất cấu hình hiện tại  
Tìm từ cuối về trước vị trí  S[i]  < S[i+1]
          Nếu chưa hết dãy (i > 0) thì:
          
+ Tìm từ cuối dãy về trước – vị trí k, sao cho S[k] >S[i] rồi đổi chỗ 
S[k] và S[i]
          + Đảo ngược đoạn cuối của xâu S từ vị trí i+1 đến n (length(s))
Until i = 0;
Bài tập 4:   Cho số  ngun dương n (n<=30).  Ví dụ: 
Tìm tất cả  các cách phân tích số  n thành tổng các số  PTS.INP
ngun dương ( 0). Các cách phân tích là hốn vị của  5
nhau thì chỉ tính 1 cách
Input: file văn bản PTS.INP gồm 1 số  ngun 
dương n
Output:   file   văn   bản   PTS.OUT,   mỗi   dịng   là 
một cách phân tích tìm được
Hướng dẫn: Xác định phương pháp sinh
­ Cấu hình đầu: {n}
16

PTS.OUT
5
4+1
3+2
3+1+1
2+2+1
2+1+1+1

1+1+1+1+1


­ Cấu hình cuối : {1,1,1....,1} (n phần tử có giá trị 1);
­ Sinh cấu hình kế tiếp: Để dễ cho việc phân tích bài tốn, xét ví dụ với n = 
8. Ta sẽ có các cấu hình tương ứng là:

1. {8}

9. {4, 3, 1}

2. {7, 1}

10
.
11
.
12
.
13
.
14
.
15
.
16
.

3. {6, 2}
4. {6, 1, 1}

5. {5, 3}
6. {5, 2, 1}
7. {5, 1, 1, 1}
8. {4, 4}

17
.
18
.
19
.
20
.
21
.
22
.

{4, 2, 2}
{4, 2, 1, 1}
{4, 1, 1, 1, 1}
{3, 3, 2}
{3, 3, 1, 1}

{3, 1, 1, 1, 1, 1}
{2, 2, 2, 2}
{2, 2, 2, 1, 1}
{2, 2, 1, 1, 1, 1}
{2, 1, 1, 1, 1, 1, 1}
{1, 1, 1, 1, 1, 1, 1, 1}


{3, 2, 2, 1}
{3, 2, 1, 1, 1}

Giả  sử  ta đang  ở  cấu hình 14.{3, 3, 1, 1}. Cấu hình kế  tiếp 15. {3, 2, 2, 1} 
được xác định như sau: Tìm từ sau ra trước, vị trí phần tử có giá trị lớn hơn 1 (vị trí 
thứ 2). Giảm vị trí thứ 2 đi một đơn vị.  Vậy tổng cịn lại (sau khi trừ  hai phần tử 
đầu) là: k­i+1. Trong đó k là số  phần tử  của cấu hình hiện có (k=4), vậy tổng cịn 
lại là 4­2+1 =3. Chia đều tổng cho các phần tử tiếp theo một lượng bằng phần tử 
thứ 2 (có giá trị bằng 2). Phần cịn dư sẽ chia cho phần tử cuối cùng. Ta được cấu 
hình 15 (3, 2, 2, 1). Để dễ hiểu ta xét thêm trường hợp với n =15. Cấu hình hiện có  
là {4, 4, 1, 1, 1, 1, 1, 1, 1}, cấu hình tiếp theo là {4, 3, 3, 3, 2}.
k=9

Cấu hình 
hiện tại

1
4

2
4

3
1

4
1

5

1

6
1

1
4

2
3

3
3

4
3

8
1
­

     k=5

Cấu sinh 
kế tiếp

7
1

5

2

­
­
17

9
1

Tìm   từ   sau   ra   trước   gặp   phần   tử 
A[i]>1   (i=2),   giảm   A[2]   1   đơn   vị, 
A[2] = 4 ­ 1 = 3;
Tổng= k – i + 1= 9 – 2 + 1 = 8;
8 chia tối đa được 2 phần tử có giá trị 
A[2]:  thương  = tổng div A[i]      8 
div 3 = 2. Gán giá trị  2 phần tử  A[3], 
A[4]  = 3. Phần dư gán cho phần tử 


Phần dư

Phương pháp sinh có thể mơ tả như sau:
A[1]:=n;
K:=1// số phần tử hiện có của cấu hình hiện tại
Repeat
  Xuất cấu hình hiện tại;
            Tìm từ sau ra trước, vị trí A[i]>1;

             Giảm A[i] một đơn vị
             Nếu chưa phải là cấu hình cuối cùng (i>0) thì

        + Tổng := k – i +1; Thương := k div A[i];  Dư := thương mod A[i];
                   + Gán các phần tử phía sau A[i] có giá trị bằng với A[i] (A[i+j] := A[i], 
với j:1thương)
                   + Cập nhật lại k: k := i + thương
                   + Nếu cịn phần dư (Dư > 0) thì gán phần dư cho phần tử A[k+1]
K:=k+1
A[k]:=Dư
Until i = 0;
Bài tập 5: Một cửa hàng nhỏ có N loại bánh khác nhau, mỗi loại bánh có số 
lượng rất lớn. Có một người mua hàng cần mua k cái bánh. Giả  sử  người đó chỉ 
quan tâm đến loại bánh mà khơng quan tâm tới cái bánh cụ  thể  và thứ  tự  chọn 
chúng. Hãy liệt kê các cách khác nhau mà khách hàng có thể lựa chọn để mua bánh.
Input: file văn bản MHANG.INP 
Ví dụ: 
gồm một dịng ghi hai số ngun dương N  MHANG.INP MHANG.OUT
và K. Giữ hai số cách nhau bằng một 
2 3
1 1 1 
khoảng cách.
1 1 2 
Output: file văn bản MHANG.OUT 
1 2 2 
2 2 2
gồm nhiều dịng, mỗi dịng là một phương 
án mua hàng của khách hàng
18


Hướng dẫn: 
­ Cấu hình đầu: {1, 1, ...,1} ­ Chọn k cái bánh loại 1

­ Cấu hình cuối: {n, n, ..., n}­ Chọn k cái bánh loại n
­ Sinh cấu hình kế tiếp: xét ví dụ n =3 và k = 5. Ta có các cấu hình:
1. {1, 1, 1, 1, 1}

8. {1, 1, 2, 2, 3}

2. {1, 1, 1, 1, 2}

9. {1, 1, 2, 3, 3}

3. {1, 1, 1, 1, 3}

10
.
11
.
12
.
13
.
14
.

4. {1, 1, 1, 2, 2}
5. {1, 1, 1, 2, 3}
6. {1, 1, 1, 3, 3} 
7. {1, 1, 2, 2, 2}

{1, 1, 3, 3, 3}
{1, 2, 2, 2, 2}

{1, 2, 2, 2, 3}
{1, 2, 2, 3, 3}
{1, 2, 3, 3, 3}

15
.
16
.
17
.
18
.
19
.
20
.
21
.

{1, 3, 3, 3, 3}
{2, 2, 2, 2, 2}
{2, 2, 2, 2, 3}
{2, 2, 2, 3, 3} 
{2, 2, 3, 3, 3}
{2, 3, 3, 3, 3} 
{3, 3, 3, 3, 3}

Phương pháp sinh có thể mơ tả như sau:
Sinh cấu hình đầu {Các phần tử đều bằng 1 – lấy k cái bánh loại 1}
Repeat

 Xuất cấu hình hiện tại
           Tìm từ sau ra trước, vị trí A[i]<>n
            Nếu chưa phải là cấu hình cuối cùng (i>0) thì
                   + Tăng A[i] lên một đơn vị
                   + Các phần tử sau A[i] bằng A[i]( A[j] := A[i] với (j: i+1  k))
Until i = 0;
Trên đây, là một số  dạng bài tốn cơ  bản có thể  dùng phương pháp sinh để 
xử  lý. Tuy nhiên, mỗi phương pháp lập trình đều có ưu và nhược điểm của riêng 
19


nó. Phương pháp sinh có  ưu điểm trong trường hợp liệt kê tồn bộ  số  lượng nhỏ 
cấu hình, nhưng đối với bộ dữ liệu lớn thì rất hạn chế trong q trình duyệt.
IV. Hiệu quả của giải pháp
 Giải pháp trên giúp học sinh tiếp cận với kỹ thuật lập trình mới, rèn luyện  
học sinh kỹ  năng lập trình, xử  lí bài tốn, phát huy tính tích cực, sáng tạo của học  
sinh. 
Áp dụng giải pháp “Vận dụng Phương pháp sinh giải một số bài tốn liệt kê  
tổ hợp theo thứ tự từ điển” góp một phần khơng nhỏ vào hiệu quả, chất lượng bồi 
dưỡng học sinh giỏi tại đơn vị trong những năm gần đây. Một số kết quả đạt được 
từ khi vận dụng giải pháp (năm học 2017­2018): 
Học sinh 
giỏi cấp tỉnh 
2018
01 giải nhì,
01 giải ba

Tin học trẻ 
2018


Được dự thi 
học sinh giỏi 
cấp Quốc gia 
2019

Tin học trẻ 
2019

01 giải ba,
01 giải khuyến khích

01 học sinh

02 giải ba

 V. Mức độ ảnh hưởng: 

      Giải pháp đã góp phần mang lại hiệu quả nhất định trong cơng tác bồi dưỡng 
học sinh giỏi tại đơn vị và có thể áp dụng ở một số đơn vị khác.
VI. Kết luận
1. Những bài học kinh nghiệm
Q trình tuyển chọn, bồi dưỡng học sinh giỏi mơn Tin học là q trình giáo 
dục nâng cao, biến những học sinh có tiềm năng thành học sinh có khả năng, những 
học sinh ít hoặc chưa bộc lộ niềm say mê, hứng thú với mơn tin học thành những  
học sinh say mê, hứng thú với mơn Tin học. Trong q trình này vai trị của người  
giáo viên rất quan tr ọng. Quan tr ọng t ừ khâu tuyển chọn, dẫn dắt, truy ền d ạy,  
uốn nắn đến việc khích lệ  sự  cố  gắng, tích cực và khả  năng tự  học, tự  sáng  
tạo của học sinh.
Phẩm chất, uy tín, năng lực của người giáo viên có  ảnh hưởng trực tiếp, 
quan trọng, thậm chí có tính quyết định đối với q trình học tập và rèn luyện của 

học sinh. Do vậy, giáo viên phải tự đào tạo, tự  cố  gắng hồn thiện về  phẩm chất 
và năng lực chun mơn; tâm huyết với cơng việc, u thương học trị và giúp đỡ 
đồng nghiệp. Giáo viên khơng chỉ truyền dạy kiến thức mà cao hơn là, dạy cho học 
sinh cách đi tìm kiến thức, chân lý từ  những bài giảng của mình. Đặc biệt đây là 
lĩnh vực thay đổi và phát triển liên tục. Giáo viên phải cập nhật kiến thức kịp thời  
mới đáp ứng được yêu cầu phát triển của môn học đặc thù này.
20


Cùng với sự  truyền dạy kiến thức, người giáo viên phải truyền được cảm 
hứng say mê, u mến mơn học cho học sinh, đặc biệt là học sinh giỏi. Khơng có 
niềm say mê, dù có kiến thức cũng ít sáng tạo và khó đạt được kết quả tốt, khó đạt 
được đỉnh cao trong học tập và thi cử, đặc biệt là lĩnh vực CNTT. 
  2. Những kiến nghị, đề xuất
Ban giám hiệu nhà trường và phụ huynh học sinh cần tạo điều kiện tốt nhất 
cho đội ngủ học sinh giỏi của trường.  Giáo viên bồi dưỡng cần quản lí và kiểm tra 
việc học tập của học sinh một cách nghiêm túc.
  Trên đây là một vài kinh nghiệm nhỏ của tơi trong q trình bồi dưỡng học 
sinh giỏi, rất mong được sự  góp ý của đồng nghiệp để  đề  tài được nhân rộng và  
đạt kết quả cao hơn. Tơi cam đoan những nội dung báo cáo là đúng sự thật.
Xin chân thành cảm ơn.
Xác nhận của đơn vị áp dụng giải pháp                               Người viết giải pháp

                                                                                          Nguyễn Phi Hùng

21


TÀI LIỆU THAM KHẢO
Sách Giáo Khoa Tin Học 11 – Hồ Sĩ Đàm (Chủ biên).

Tài Liệu Sách Giáo Khoa Chun Tin Học Quyển 1, 2 – Hồ Sĩ Đàm (Chủ biên).
150 Bài Tập Tốn Tin – Lê Minh Hồng.
Giải Thuật & Lập Trình – Lê Minh Hồng.
Wedsite: 

22



×