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.

pdf33 trang | Chia sẻ: thuydung3ka2 | Ngày: 05/03/2022 | Lượt xem: 819 | Lượt tải: 2Download
Bạn đang xem 20 trang mẫu của tài liệu "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", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
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, 2N1000 
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:

  • pdfsang_kien_kinh_nghiem_giup_hoc_sinh_tiep_can_voi_phuong_phap.pdf
Sáng Kiến Liên Quan