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
20172018 đế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: {nk+1, nk+2, …,n}.Giá trị lớn nhất của phần tử thứ i là:
nk+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
(nk+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[j1] +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, n1, n2,…, 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 x
begin
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 n4 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:=n4;
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à: ki+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à 42+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:1thươ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 20172018):
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