Sáng kiến kinh nghiệm Giúp học sinh tiếp cận với phương pháp quy hoạch động bằng một số bài toán đơn giản trong Tin học
Các bước giải quyết bài toán bằng phương pháp quy hoạch động.
- Bước 1: Xây dựng hàm mục tiêu
Áp dụng nguyên lý tối ưu của Bellman ta phân rã bài toán ban đầu thành các bài
toán con có cùng cấu trúc sao cho việc giải quyết bài toán con cấp i phụ thuộc vào kết
quả của các bài toán con trước đó. Cụ thể hóa bước này là ta phải xây dựng được hàm
mục tiêu F(i) là nghiệm của bài toán con cấp i.
- Bước 2: Xác định các bài toán cơ sở.
Bài toán cơ sở là các bài toán con nhỏ nhất mà ta có thể biết ngay kết quả hoặc
tính được kết quả dễ dàng. Đây chính là cơ sở để tính nghiệm cho các bài toán cấp lớn
hơn.
- Bước 3: Xây dựng công thức truy hồi8
Căn cứ vào ý nghĩa của hàm mục tiêu, tìm mối quan hệ giửa các bài toán con các
cấp, ta tiến hành xây dựng công thức tính kết quả của bài toán cấp i dựa vào kết quả
của các bài toán con cấp trước đó.
- Bước 4: Lập bảng phương án
Sử dụng công thức truy hồi và nghiệm các bài toán cơ sở tính nghiệm tất cả các
bài toán con và lưu trữ chúng vào bảng phương án.
- Bước 5: Kết luận nghiệm của bài toán.
Dựa vào bảng phương án chỉ ra nghiệm của bài toán. Các bước giải quyết trên
tuy rất cụ thể nhưng vẫn trừu tượng đối với học sinh.
n giải bài
toán tối ưu
- Thuật toán vét cạn là thuật toán tìm phương án
tối ưu của bài toán bằng cách lựa chọn một
phương án trong tập hợp tất cả các phương án của
bài toán để tìm ra phương án tối ưu. Trong nhiều
bài toán, không gian các phương án quá lớn. Vét
cạn giúp tìm ra kết quả tối ưu nhưng độ phức tạp
lớn, thường là hàm mũ trong khi phương pháp
quy hoạch động độ phức tạp là đa thức. Do vậy,
khi áp dụng thuật toán vét cạn không đảm bảo về
thời gian cũng như kĩ thuật. Vét cạn là xét toàn
bộ trường hợp, rồi tìm ra kết quả.
- Ưu điểm của vét cạn là chắc chắn tìm ra lời giải
(nếu có)
- Nhược điểm của nó là có thể chạy quá lâu, vượt
mức thời gian cho phép
Chú ý: Vét cạn theo nghĩa thông thường là xét
hết mọi đối tượng hay mọi trường hợp. Trong lập
trình, vét cạn là phương pháp được dùng khi
không còn phương pháp nào hiệu quả hơn có thể
sử dụng được.
III. Cài đặt chương trình cho một số bài toán đơn giản thường gặp
Vì trong đề tài chỉ nói đến những bài toán đơn giản nên thường là những bài toán
dễ tìm ra phương pháp giải và phương pháp giải thường dùng là đệ quy hoặc quy hoạch
16
động. Nên phần ví dụ trong SKKN này mỗi bài toán tôi chỉ xin phép đề cập đến mối
tương quan giữa hai phương pháp là đệ quy và quy hoạch động. Tức là trong phần
chương trình của từng bài tôi thường có thêm biến “đếm” để đếm số lần lặp thực hiện
trong từng bài khi chạy cùng số test để người học có thể thấy được cái nào hay, cái nào
ngắn hơn. Giúp người học dể hiểu, dễ phân biệt và rút ra được cái hay và cái chưa hay
của quy hoạch động trong từng bài toán.
Ví dụ 1: Bài toán tính an (n là số nguyên dương).
Cách xác định bài toán
- Input: a, n
- Output: giá trị an
Ý tưởng của bài toán
- Ta thấy n = 0 thì f(0) =1
n = 1 thì f(1) = a
n = 2 thì f(2) = f(1)*a
n = 3 thì f(3) = f(2)*a
..
n = i thì f(i) = f(i-1)*a
- Trong bài toán này có giá trị chặn là n = 0
Cài đặt chương trình
Phương pháp QHĐ Phương pháp ĐQ
uses crt;
var n,i,a,dem:longint;
g:text;
f:array[0..100] of int64;
function lthua(a,n:longint):int64;
begin
f[0]:=1;
for i:=1 to n do
begin
f[i]:=a*f[i-1];
uses crt;
var n,a,dem:longint;
f:text;
function lthua(a,n:longint):int64;
begin
dem:=dem+1;
if n =0 then lthua:=1
else lthua:=a*lthua(a,n-1);
end;
BEGIN
17
dem:=dem+1;
end;
lthua:=f[i];
end;
BEGIN
clrscr;
assign(g,'nhap.inp'); reset(g);
dem:=0;
//write('nhap a,n:=');readln(a,n);
readln(g,a,n);
close(g);
lthua(a,n);
assign(g,'xuat.out'); rewrite(g);
writeln(g,'KQ BT lthua thuc hien
bang pp QHD la:');
writeln(g,'so lan lap la:=',dem);
write(g,'lthua la:=',lthua(a,n));
close(g);
END.
clrscr;
dem:=0;
assign(f,'nhap.inp'); reset(f);
//write('nhap a,n:=') ; readln(a,n);
readln(f,a,n);
close(f);
assign(f,'xuat.out'); rewrite(f);
lthua(a,n);
writeln(f,'KQ BT luy thua thuc hien
bang pp DE QUY la:');
writeln(f,'so lan lap la:=',dem);
write(f,'luy thua la:=',lthua(a,n));
close(f);
END.
Chạy thử chương trình
18
* Nhận xét: Qua phần chạy thử bộ test 210 ta thấy chương trình chạy bằng quy hoạch
động số lần lặp là 10. Còn chương trình chạy bằng đệ quy số lần lặp lại bằng 11. Số lần
lặp sử dụng phương pháp QHĐ ít hơn sử dụng phương pháp ĐQ 1 lần.
Ví dụ 2: Tính n! (n là số nguyên dương)
Cách xác định bài toán
- Input: n
- Output: giá trị giai thừa của n
Ý tưởng của bài toán
- Ta thấy n = 0 thì f(0) =1
n = 1 thì f(1) = 1
n = 2 thì f(2) = f(1)*2
n = 3 thì f(3) = f(2)*3
..
n = i thì f(i) = f(i-1)*i
- Trong bài toán này có hai giá trị chặn là n = 0 và n = 1
Cài đặt chương trình
Phương pháp QHĐ Phương pháp ĐQ
Uses crt;
var n,i,dem:longint;
g:text;
f:array[0..100] of int64;
function gthua(n:longint):int64;
begin
f[1]:=1;
for i:= 2 to n do
begin
dem:=dem+1;
f[i]:=i*f[i-1];
end;
Uses crt;
var dem,n:longint;
f:text;
function gthua(n:longint):int64;
begin
dem:=dem+1;
if n <2 then gthua:=1
else gthua:=(n*gthua(n-1));
end;
BEGIN
clrscr;
dem:=0;
19
exit(f[n]);
end;
BEGIN
clrscr;
dem := 1;
//write('nhap n:='); readln(n);
//n := 15;
assign(g,'nhap.inp'); reset(g);
readln(g,n);
close(g);
assign(g,'xuat.out');
rewrite(g);
gthua(n) ;
writeln(g,'KQ BT tinh GIAI THUA
bang PP QHD la:');
writeln(g,'So lan lap la:=',dem);
writeln(g,'Giai thua cua so ',n,' co
gia tri la:=',gthua(n));
close(g);
END.
//write('nhap n:='); readln(n);
assign(f,'nhap.inp'); reset(f);
readln(f,n);
close(f);
assign(f,'xuat.out'); rewrite(f);
gthua(n) ;
writeln(f,'KQ BT tinh GIAI THUA
bang PP DE QUY la:');
writeln(f,'So lap la:=',dem);
writeln(f,'Giai thua cua ',n,' co gia
tri la:=',GTHUA(n));
close(f);
END.
Chạy thử chương trình
20
* Nhận xét: Ta chạy thử với test bằng 5 thì số lần lặp của hai phương pháp trên là như
nhau, đều lặp lại 5 lần. Ta thấy rằng trong trường hợp này phương pháp quy hoạch động
không hơn gì phương pháp đệ quy.
Ví dụ 3: Dãy số fibonacci:
Tính số hạng thứ n của dãy fibonacci bằng phương pháp đệ quy.
Trong đó chuỗi có giá trị như sau: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...
Cách xác định bài toán
- Input: n
- Output: giá trị fibonacci của n
Ý tưởng của bài toán
- Ta thấy n = 0 thì f(0) =1
n = 1 thì f(1) = 1
n = 2 thì f(2) = f(1) + f(0)
n = 3 thì f(3) = f(2) + f(1)
..
n = i thì f(i) = f(i-1) + f(i-2)
- Trong bài toán này có hai giá trị chặn là n = 0 và n = 1
Cài đặt chương trình
Phương pháp QHĐ Phương pháp ĐQ
uses crt;
var n,i,a,dem:longint;
f:array[0..100] of longint;
g:text;
function qhd(n:longint):int64;
begin
f[0]:=1; f[1]:=1;
for i:=2 to n do
begin
f[i]:=f[i-1]+f[i-2];
uses crt;
var n,i,dem:longint;
f:text;
function dq(n:longint):int64;
begin
dem:=dem+1;
if n<2 then exit(1)
else exit(dq(n-1)+dq(n-2));
end;
BEGIN
21
dem:=dem+1 ;
end;
qhd:=f[i];
end;
BEGIN
clrscr;
dem := 2;
// Write('nhap n:='); readln(n);
assign(g,'nhap.inp'); reset(g);
readln(g,n);
close(g); qhd(n);
assign(g,'xuat.out'); rewrite(g);
writeln(g,'KQ BT tinh so FIBO bang
PP QHD la:');
writeln(g,'So lan lap la:=',dem);
writeln(g,'So FIBO thu ',n,' co gia tri
la:=',qhd(n));
close(g);
END.
clrscr;
dem:=0;
//Write('nhap n:='); readln(n);
assign(f,'nhap.inp'); reset(f);
readln(f,n);
close(f);
dq(n) ;
assign(f,'xuat.out'); rewrite(f);
writeln(f,'KQ BT tinh so FIBO bang
PP DE QUY la:');
writeln(f,'So lan lap la:=',dem);
writeln(f,'So FIBO thu ',n,' co gia tri
la:=',dq(n));
close(f);
END.
Chạy thử chương trình
22
* Nhận xét: Trong bài toán này khi chạy thử với giá trị n nhỏ thì thấy số lần lặp không
hơn nhau nhiều. Nhưng khi chạy thử với giá trị n lớn hơn thì đối với phương pháp QHĐ
ta thấy số lần lặp là 41. Còn đối với phương pháp ĐQ số lần lặp là 331 160 281, lớn
hơn rất nhiều so với QHĐ. Như vậy, trong bài toán này ta chọn PP QHĐ sẽ nhanh hơn
ĐQ rất nhiều.
Ví dụ 4: Bài toán tháp Hà Nội
Chuyển n chiếc đĩa từ cọc 1 sang cọc 2 theo thứ tự từ lớn đến nhỏ. có sử dụng cọc
3 làm cọc trung gian. Mỗi lần di chuyển được 1 đĩa. Và đĩa đĩa lớn phải ở dưới đĩa
nhỏ.
Cách xác định bài toán
- Input: n
- Output: Số bước thực hiện chuyển đĩa từ cọc này sang cọc khác.
Ý tưởng của bài toán
Đầu tiên ta phải chuyển được tất cả (n-1) đĩa nhỏ qua cột thứ hai, chuyển đĩa to
nhất qua cột thứ ba rồi chuyển (n-1) đĩa từ cột thứ hai sang cột thứ ba. Trò chơi sẽ kết
thúc!
Nếu gọi S(n) là số bước để di chuyển n đĩa qua cột ta cần thì:
Bước 1: Chuyển (n-1) đĩa bé hơn từ cột (1) sang cột (2). Chúng ta có S(n-1)
bước di chuyển.
Bước 2: Chuyển đĩa to nhất từ cột (1) sang cột (3). Chúng ta có 1 bước di
chuyển.
Bước 3: Chuyển (n-1) đĩa từ cột (2) sang cột (3). Chúng ta có S(n-1) bước di
chuyển.
23
Cài đặt chương trình
Phương pháp QHĐ Phương pháp ĐQ
uses crt;
var dem,i,n:longint;
f:array[0..100] of longint;
g:text;
function thaphn(n:longint):longint;
begin
// dem:=dem+1;
f[1]:=1;
for i:=2 to n do
begin
f[i]:=2*f[i-1]+1;
dem := dem+1;
end;
thaphn:=f[i];
end;
BEGIN
clrscr;
dem := 1;
//write('Nhap vao so chiec dia:=');
readln(n);
assign(g,'nhap.inp'); reset(g);
readln(g,n);
close(g);
assign(g,'xuat.out'); rewrite(g);
writeln(g,'KQ BT thap HA NOI bang
PP QHD la:');
uses crt;
var dem,n:longint;
f:text;
function thaphn(n:longint):longint;
begin
dem:=dem+1;
if n=1 then exit(1)
else exit (1+2*thaphn(n-1)) ;
end;
BEGIN
clrscr;
dem:=0;
assign(f,'nhap.inp');
reset(f);
readln(f,n);
close(f);
assign(f,'xuat.out');
rewrite(f);
// write('Nhap vao so chiec dia:=');
readln(n);
writeln(f,'KQ BT thap HA NOI bang
PP DQ la:');
// thaphn(n);
writeln(f,'so lan chuyen la :
',thaphn(n));
writeln(f,'So lan lap la:=',dem);
24
//thaphn(n);
writeln(g,'so lan chuyen la :
',thaphn(n));
writeln(g,'So lan lap la:=',dem);
close(g);
END.
close(f);
END.
Chạy thử chương trình
* Nhận xét: Trong bài toán này cả hai phương pháp đều có số lần lặp như nhau.
Ví dụ 5: Bài toán cái túi
Trong siêu thị có n gói hàng (n <= 100), gói hàng thứ i có trọng lượng là Wi <=
100 và trị giá Vi <= 100. Một tên trộm đột nhập vào siêu thị, sức của tên trộm không
thể mang được trọng lượng vượt quá M (M <= 100). Hỏi tên trộm sẽ lấy đi những gói
hàng nào để được tổng giá trị lớn nhất.
Cách xác định bài toán
caitui.inp caitui. out
Dòng 1: n, m cách nhau ít nhất một
dấu cách
n dòng tiếp theo: Mỗi dòng gồm 2
số Wi, Vi, là chi phí và giá trị đồ
vật thứ i.
Ghi giá trị lớn nhất tên trộm có thể lấy
Ví dụ
25
caitui.inp caitui. out
5 15
12 4
2 2
1 1
1 2
4 10
15
Ý tưởng của bài toán
Giải quyết bài toán trong các trường hợp sau:
Mỗi vật chỉ được chọn một lần.
Mỗi vật được chọn nhiều lần (không hạn chế số lần)
Cách giải:
* Trường hợp mỗi vật được chọn 1 lần
Ta nhận thấy rằng: Giá trị của cái túi phụ thuộc vào 2 yếu tố: Có bao nhiêu vật
đang được xét và trọng lượng còn lại cái túi có thể chứa được, do vậy chúng ta có 2 đại
lượng biến thiên. Cho nên hàm mục tiêu sẽ phụ thuộc vào hai đại lượng biến thiên. Do
vậy bảng phương án của chúng ta sẽ là bảng 2 chiều.
Gọi F[i,j] là tổng giá trị lớn nhất của cái túi khi xét từ vật 1 đến vật i và trọng của
cái túi chưa vượt quá j. Với giới hạn j, việc chọn tối ưu trong số các vật {1,2,,i-1,i}
để có giá trị lớn nhất sẽ có hai khả năng:
Nếu không chọn vật thứ i thì F[i,j] là giá trị lớn nhất có thể chọn trong số các vật
{1,2,,i-1} với giới hạn trọng lượng là j, tức là:
F[i,j]:=F[i-1,j].
Nếu có chọn vật thứ i (phải thỏa điều kiện W[i] ≤ j) thì F[i,j] bằng giá trị vật thứ
i là V[i] cộng với giá trị lớn nhất có thể có được bằng cách chọn trong số các vật
{1,2,,i-1} với giới hạn trọng lượng j-W[i] tức là về mặt giá trị thu được:
F[i,j]:=V[i]+F[i-1,j-W[i]]
Vậy chúng ta phải xem xét xem nếu chọn vật i hay không chọn vật i thì sẽ tốt hơn.
Từ đó chúng ta có công thức truy hồi như sau.
F[0,j] = 0 (hiển nhiên) – Bài toán con nhỏ nhất.
26
F[i,j]= max(F[i-1,j], V[i]+F[i-1,j-W[i]]
* Trường hợp mỗi vật được chọn nhiều lần: Tương tự như suy luận ở trên ta xét:
Nếu không chọn vật thứ i thì F[i,j] là giá trị lớn nhất có thể chọn trong số các vật
{1,2,,i-1} với giới hạn trọng lượng là j, tức là:
F[i,j]:=F[i-1,j].
Nếu có chọn vật thứ i (phải thỏa điều kiện W[i] ≤ j) thì F[i,j] bằng giá trị vật thứ
i là V[i] cộng với giá trị lớn nhất có thể có được bằng cách chọn trong số các vật
{1,2,,i} (vì vật i vẫn có thể được chọn tiếp) với giới hạn trọng lượng j-W[i] tức là về
mặt giá trị thu được:
F[i,j]:=V[i]+F[i,j-W[i]]
Do vậy chúng ta có công thức truy hồi như sau:
F[0,j] = 0 (hiển nhiên) – Bài toán con nhỏ nhất.
F[i,j]= max(F[i-1,j], V[i]+F[i,j-W[i]]
Cài đặt chương trình
Phương pháp QHĐ Phương pháp ĐQ
uses crt;
const
fi='nhap.inp';
fn='xuat.out';
var
g1,g2:text;
n,m,i,j,dem:longint;
v,w:array[1..100] of longint;
f:array[0..100,0..100] of longint;
//=================
procedure qhd;
begin
fillchar(f[0],sizeof(f[0]),0);
for i:=1 to n do
uses crt;
const
fi='nhap.inp';
fn='xuat.out';
var
g1,g2:text;
v,w,f:array[0..100] of longint;
n,m,i,j,dem,max:longint;
kt:array[0..100] of boolean;
//=================
procedure test;
var i1,s1,s:longint;
begin
s:=0; s1:=0;
27
for j:=0 to m do
begin
dem:=dem+1;
f[i,j]:=f[i-1,j];
if (j>=v[i]) and
(f[i-1,j-v[i]]+w[i]>f[i,j]) then
f[i,j]:=f[i-1,j-
v[i]]+w[i];
end;
end;
//==================
begin
clrscr;
assign(g1,fi); reset(g1);
assign(g2,fn); rewrite(g2);
readln(g1,n,m);
for i:=1 to n do
readln(g1,v[i],w[i]);
dem:=0;
qhd;
writeln(g2, 'KQ cua BT cai tui
giai = pp qhd la: ');
writeln(g2, 'gia tri lon nhat co
the la: ', f[n,m]);
writeln(g2, 'so lan lap la: ',
dem);
close(g1); close(g2);
end.
for i1:=1 to n do
begin
inc(dem);
s:=s+w[f[i1]];
s1:=s1+v[f[i1]];
if s1>m then exit;
end;
if s>max then max:=s;
end;
//===================
procedure try(i:longint);
var j:longint;
begin
inc(dem);
for j:=0 to n do
if (j=0) or (kt[j]) then
begin
kt[j]:=false;
f[i]:=j;
if (i=n) then test
else try(i+1);
kt[j]:=true;
end;
end;
//===================
begin
clrscr;
assign(g1,fi); reset(g1);
28
* Nhận xét: Trong bài toán này ta thấy PP QHĐ có số lần lặp ít hơn rất nhiều so với
PP ĐQ.
assign(g2,fn); rewrite(g2);
readln(g1,n,m);
v[0]:=0; w[0]:=0; dem:=0;
for i:=1 to n do
begin
kt[i]:=true;
readln(g1,v[i],w[i]);
end;
max:=0; try(1);
writeln(g2,' KQ cua BT cai tui
bang PP DQ la :');
writeln(g2,' gia tri lon nhat :
',max);
writeln(g2,' so lan lap la: ',dem);
close(g1); close(g2);
end.
Chạy thử chương trình
29
IV. Bài tập tự giải
Bài toán 1: Dãy con có tổng bằng S
Cho N số nguyên dương tạo thành dãy A={A1,,AN}. Tìm một dãy con của A
có tổng các phần tử bằng S.
Dữ liệu vào từ file DAYCON.INP
Dòng đầu tiên ghi hai số nguyên dương N (0≤N≤200) và S (0≤S≤40000)
Các dòng tiếp theo lần lượt ghi N số hạng của dãy A (0≤Ai≤200)
Kết quả ra ghi ra file DAYCON.OUT
Nếu bài toán vô nghiệm ghi số 0.
Nếu bài toán có nghiệm thì trên dòng thứ nhất ghi số 1. Các dòng tiếp theo, mỗi
dòng ghi hai số là chỉ số trong dãy A và giá trị của một phần tử được chọn.
Bài toán 2: Dãy con có tổng lớn nhất
Cho dãy n số nguyên dương a1, a2, , an. Một dãy con của dãy nói trên là dãy
được lập từ dãy đã cho bằng cách bỏ đi một số số hạng của dãy và giữ nguyên trật tự
các số còn lại. Hãy tìm một dãy con thoả mãn tính chất:
Không có ba số liên tiếp nào của dãy ban đầu có mặt trong dãy con
Trong ba số liên tiếp của dãy ban đầu có ít nhất một số có mặt trong dãy con
Tổng các số hạng của dãy con được chọn là lớn nhất có thể được.
Dữ liệu: Vào từ file CHONSO.INP:
Dòng đầu tiên chứa số nguyên dương N (N≤1000)
N dòng tiếp theo, dòng thứ i chứa số nguyên dương ai (ai≤30000)
Kết quả: Ghi ra file văn bản CHONSO.OUT:
Dòng đầu tiên chứa hai số nguyên dương M và T trong đó M là số lượng các số
hạng của dãy con được chọn, T là tổng các số của dãy chon được chọn.
M dòng tiếp theo lần lợt mô tả các số hạng của dãy con được chọn, dòng thứ k
ghi số jk là chỉ só của số hạng được chọn thứ k.
Ví dụ:
CHONSO.INP CHONSO.OUT
6
2
21 4
2
30
6
5
1
7
3
3
5
6
Bài toán 3: Chia kẹo
Có N gói kẹo, gói thứ i có A[i] cái kẹo.
Yêu cầu: Hãy tìm cách chia các gói kẹo này thành 2 phần sao cho độ chênh lệch
giữa số kẹo ở hai phần là ít nhất có thể được. 0<A[i]<10000, 2N1000
Dữ liệu vào: Cho trong file CANDY.INP: Gồm N dòng, dòng thứ i chứa số nguyên
A[i] là số kẹo trong gói thứ i
Kết quả: Ghi ra file CANDY.OUT:
Dòng đầu tiên ghi 3 số: Tổng số kẹo ở phần 1, phần 2 và độ chênh lệch giữa hai
phần
Dòng 2, 3 là số hiệu các gói kẹo ở mỗi phần được chia.
Ví dụ:
CANDY.INP CANDY.OUT
3
4
7
12
14 12 2
3 4 7
12
VIII. Những thông tin cần bảo mật: Không
IX. Các điều kiện cần thiết để áp dụng sáng kiến: Học sinh đội tuyển Tin học lớp
10, 11, 12.
X. Đánh giá lợi ích thu được hoặc dự kiến có thể thu được do áp dụng sáng kiến
theo ý kiến của tác giả:
Học sinh được học theo nội dung trình bày trong sáng kiến sẽ có cái nhìn toàn
diện hơn, tự tin hơn khi đối mặt với bài toán trong Tin học từ đó các em sẽ thích học và
chủ động tìm hiểu kiến thức. Nội dung sáng kiến được trình bày logic, phù hợp với
trình độ phát triển tư duy của học sinh từ nhận biết, thông hiểu đến vận dụng, nâng cao
và sáng tạo qua đó giúp cho học sinh phát triển tư duy tổng hợp và rèn luyện các kĩ
năng viết chương trình sử dụng phương pháp quy hoạch động.
31
Bảng số liệu kết quả của học sinh đội tuyển Tin trường THPT Nguyễn Viết Xuân
năm học 2017 – 2018 khi chưa thực hiện đề tài:
STT Khối Số lượng hs
Số học sinh đạt giải
Nhất Nhì Ba KK
1 10 5 0 0 0 2
2 11 3 0 0 1 1
3 12 1 0 0 1 0
- Một số học sinh có tiến bộ rõ rệt khi tiếp cận các bài toán sử dụng phương pháp QHĐ.
- Nâng cao việc yêu thích học Tin học đối với một bộ phận học sinh và một số em có
định hướng nghề nghiệp sau này.
- Bảng số liệu kết quả đạt được của học sinh đội tuyển Tin học – trường THPT Nguyễn
Viết Xuân năm học 2018 – 2019 sau khi thực hiện đề tài:
STT Khối Số lượng hs
Số học sinh đạt giải
Nhất Nhì Ba KK
1 10 5 0 1 2 1
2 11 4 0 1 2 0
3 12 4 0 1 2 1
Bản thân tôi khi viết đề tài này đã phần nào đó rèn luyện cho mình khả năng
nghiên cứu khoa học, tìm tòi và phân tích và tổng hợp tài liệu từ nhiều nguồn khác
nhau, tăng cường khả năng tự học, tự bồi dưỡng chuyên môn.
Sáng kiến kinh nghiệm sẽ là tài liệu tham khảo cơ bản về phương pháp quy hoạch
động để trao đổi kinh nghiệm với đồng nghiệp và truyền đạt cho học sinh.
Mặc dù đã cố gắng rất nhiều trong quá trình viết sáng kiến kinh nghiệm này
nhưng do thời gian có hạn nên chắc chắn sẽ không tránh khỏi những sai sót. Kính mong
quý thầy cô, đồng nghiệp và học sinh chân thành góp ý để sáng kiến kinh nghiệm:
“Giúp học sinh tiếp cận với thuật toán quy hoạch động bằng một số bài toán đơn giải
trong Tin học” được hoàn thiện hơn và trở thành một tài liệu hay, hữu ích trong việc
dạy và học lập trình.
32
XI. Danh sách những tổ chức/cá nhân đã tham gia áp dụng thử hoặc áp dụng sáng
kiến lần đầu:
STT Tên tổ chức/cá nhân Địa chỉ
Phạm vi/Lĩnh vực
áp dụng sáng kiến
1 Nguyễn Thị Hà
Trường THPT Nguyễn
Viết Xuân
Học sinh đội tuyển Tin
học khối 10, 11, 12
Vĩnh Tường,
Ngày 12 tháng 02 năm 2020
Thủ trưởng đơn vị/
Chính quyền địa phương
(Ký tên, đóng dấu)
Vĩnh Tường,
ngày 14 tháng 02 năm 2020
CHỦ TỊCH HỘI ĐỒNG
SÁNG KIẾN CẤP CƠ SỞ
(Ký tên, đóng dấu)
Vĩnh Tường,
ngày 10 tháng 02 năm 2020
Tác giả sáng kiến
(Ký, ghi rõ họ tên)
Nguyễn Thị Hà
33
TÀI LIỆU THAM KHẢO
[1]. Hồ Sĩ Đàm (chủ biên), Đỗ Đức Đông, Lê Minh Hoàng, Nguyễn Thanh Hùng
(2009), Tài liệu giáo khoa chuyên tin, NXB Giáo dục.
[2]. Robert Sedgewich – Người dịch: Trần Đan Thư, Vũ Mạnh Tưởng, Dương Vũ Diệu
Trà, Nguyễn Tiến Huy (In lần thứ 5), Cẩm nang thuật toán, NXB Khoa học và kỹ thuật
[3]. Lê Minh Hoàng, Bài giảng chuyên đề Giải thuật và lập trình, NXB Đại học sư
phạm Hà Nội, 1999 – 2002.
[4]. Trần Lê Hồng Dũ, Phạm Ngọc Chí Nhân – Trường THPT Bến Tre, Các bài toán
về quy hoạch động.
[5]. Nguyễn Hưu Điển, Một số vấn đề về thuật toán, NXB Giáo dục
[6]. Nguyễn Chí Trung, Giáo trình thuật toán và kỹ thuật lập trình Pascal – NXB Sở
giáo dục và đào tạo Hà Nội.
File đính kèm:
sang_kien_kinh_nghiem_giup_hoc_sinh_tiep_can_voi_phuong_phap.pdf
