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

Bài tập phân tích và thiết kế thuật toá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 (200.11 KB, 43 trang )

Bài t
ập nhóm 1B
– KHMT 2014
Trang 1
M
ỤC LỤC
Bài tập 1 : Viết chương trình con để tính tích của 2 ma trận A và B có kích
thư
ớc là A[m,n] và B[p,q]. Từ đó xác định độ phức tạp của thuật toán này.
. 2
Bài t
ập 2 : Viết hàm tính a
n
mà có đ
ộ phức tạp O(1).
5
Bài t
ập 3 : Chứng minh rằng thủ tục Sort(n), có độ phức tạp hàm mũ
5
Bài t
ập 4 : Viết thuật toán đệ quy nhằm xóa tất cả các phần tử có giá trị bằng x
trong dãy s
ố nguyên a[1],a[2],… ,a[n].
6
Bài t
ập 5 : Xét danh sách F nh
ư phần lý thuyết.
Vi
ết thuật toán
để liệt kê giá trị
trư


ờng info của tất cả các nút thuộc danh sách F theo thứ tự ng
ược
8
Bài t
ập 6 : Viết thuật toán
đ

xóa t
ất cả các nút có giá trị tr
ư
ờng info bằng x của
danh sách tăng d
ần F. Từ đó cho biết độ phức tạp của thuật toán.
9
Bài t
ập 7
: Vi
ết thuật toán để điều chỉnh cây T bất kì thành 1 đống
13
Bài t
ập 8: Bài toán xác suất
19
Bài t
ập 9 : Bài toán túi xách
20
Bài t
ập 10 : Bài toán phép nhân tổ hợp nhiều ma trận
25
Bài t
ập 11 : Bài toán xâu cực đại

28
Bài t
ập 12 : Bài toán du lịch
32
Bài t
ập 13 : Bài toán sinh viên ôn thi
38
Bài t
ập nhóm 1B
– KHMT 2014
Trang 2
BÀI LÀM
Bài t
ập 1 :
Vi
ết chương trìn
h con đ
ể tính tích của 2 ma trận A và B có kích thước là
A[m,n] và B[p,q]. Từ đó xác định độ phức tạp của thuật toán này . Chú ý ( n=p).
Function TichMT(A:Mang;m,n:integer;B:Mang;p,q:integer):Mang;
Var C: Mang;
d:integer;
Begin
For i:=1 to m do
For j:=1 to q do
begin
C[i,j]:=0;
For d:=1 to n do C[i,j]:=A[i,d]*B[d,j] + C[i,j];
end;
TichMT:=C;

End;
{CHƯƠNG TRÌNH CHÍNH}
Program Tich2Matran;
Const max=100;
Type Mang=array[1 max,1 max] of Integer;
Var mang1,mang2:Mang;
m,n,p,q:integer; {S
ố hàng và cột của ma trận}
i,j: integer; {Dùng trong vòng l
ặp}
{Th
ủ tục nhập kích thước của ma trận}
Procedure NhapKTMT(Var m,n:integer);
Begin
Write('Nhap so hang cua Ma tran :');Readln(m);
Write('Nhap so cot cua Ma tran :');Readln(n);
End;
{Thủ tục nhập giá trị cho ma trận}
Procedure NhapMT(Var A:Mang;m,n:integer);
Begin
For i:=1 to m do
Bài t
ập nhóm 1B
– KHMT 2014
Trang 3
For j:=1 to n do
begin
Write('Gia tri phan tu thu [',i,',',j,']=');Readln(A[i,j]);
end;
End;

{Th
ủ tục in ra ma trận}
Procedure InMT(A:Mang;m,n:integer);
Begin
For i:=1 to m do
begin
For j:=1 to n do Write(A[i,j]:4);
Writeln;
end;
End;
{Hàm ki
ểm tra 2 ma trận. Nếu số cột của ma trận 1= Số hàng của ma trận 2 thì mới
th
ực hiện tính tích 2 ma trận }
Function KiemtraMT(m,n,p,q:integer):Boolean;
Begin
If n=p then KiemtraMT:=true
else KiemtraMT:=false;
End;
{Nhân hai ma trận}
Function TichMT(A:Mang;m,n:integer;B:Mang;p,q:integer):Mang;
Var C: Mang;
d:integer;
Begin
For i:=1 to m do
For j:=1 to q do
begin
C[i,j]:=0;
For d:=1 to n do C[i,j]:=A[i,d]*B[d,j] + C[i,j];
end;

Bài t
ập nhóm 1B
– KHMT 2014
Trang 4
TichMT:=C;
End;
BEGIN
NhapKTMT(m,n);
NhapMT(mang1,m,n);
Writeln('Ma tran 1 :');
InMT(mang1,m,n);
NhapKTMT(p,q);
If KiemtraMT(m,n,p,q) then
begin
NhapMT(mang2,p,q);
Writeln('Ma tran 2 :');
InMT(mang2,p,q);
Writeln('TICH HAI MA TRAN :');
InMT(TichMT(mang1,m,n,mang2,p,q),m,q);
end
Else Write('Ma tran 2 sai kich thuoc nen khong thuc hien duoc phep nhan');
END.
Đ
ộ phức tạp tính toán của CTC trên là : O(
m*n*p)
D
ữ liệu chạ
y th
ử :
Nhap so hang cua Ma tran :3

Nhap so cot cua Ma tran :2
Gia tri phan tu thu [1,1]=1
Gia tri phan tu thu [1,2]=0
Gia tri phan tu thu [2,1]=1
Gia tri phan tu thu [2,2]=1
Gia tri phan tu thu [3,1]=0
Gia tri phan tu thu [3,2]=0
Ma tran 1 :
1 0
1 1
0 0
Nhap so hang cua Ma tran :2
Nhap so cot cua Ma tran :4
Gia tri phan tu thu [1,1]=1
Gia tri phan tu thu [1,2]=0
Gia tri phan tu thu [1,3]=1
Gia tri phan tu thu [1,4]=1
Gia tri phan tu thu [2,1]=0
Gia tri phan tu thu [2,2]=1
Gia tri phan tu thu [2,3]=1
Gia tri phan tu thu [2,4]=0
Ma tran 2 :
1 0 1 1
0 1 1 0
TICH HAI MA TRAN :
1 0 1 1
Bài t
ập nhóm 1B
– KHMT 2014
Trang 5

1 1 2 1
0 0 0 0
Bài t
ập 2 :
Vi
ết hàm tính a
n
mà có đ
ộ phức tạp O(1).
Function LuyThua(a:real;n:byte):real;
Var kq:real;
Begin
If n=0 then LuyThua:=1
Else if a=0 then LuyThua:=0
else kq:=exp(n*ln(abs(a))) ;
If (a<0) and (n mod 2<>0) then LuyThua:=-kq
Else LuyThua:=kq;
End;
Gi
ải thích sử dụng công thức exp(n*ln(abs(a))) :
Ta đ
ặt X=a
n
ln 2 v
ế ta được lnX=ln a
n
=n*lna
T
ừ đó ta có thể tính X bằng công thức là
: X=e

n*lna
Hàm exp(x) = e
x
Hàm ln(x) = lnx
S
ử dụng abs(a) bởi vì dùng hàm ln(x) số âm
s
ẽ lỗi. Sau đó ta biện luận thêm trường
hợp nếu a âm, mũ là số lẽ thì sau khi lũy thừa sẽ có dấu ‘ –‘, ngước lại thì dấu ‘+’
Bài t
ập 3 :
Ch
ứng minh rằng thủ tục Sort(n), có độ phức tạp hàm mũ
Procedure sort(n:integer);
Var tg : integer;
Begin
if n>1 then
begin
sort(n-1);
if a[n]<a[n-1] then
begin
tg:=a[n];
a[n]:=a[n-1];
a[n-1]:=tg;
sort(n-1);
end;
end;
End;
Bài t
ập nhóm 1B

– KHMT 2014
Trang 6
Ch
ứng minh:
- Phép toán tích c
ực là phép toán so sánh n>1
- G
ọi g(n) là số lần thực hiện của phép toá
n tích c
ực của chương trình con sort(n)
- Công th
ức truy hồi của g(n) trong trường hợp xấu nhất g(n)=2g(n
-1) + 1
- Dùng phương pháp th
ế để giải hệ thức truy hồi

ớc 1 : Suy đoán nghiệm g(n)=O(2
n
)

ớc 2 : Sử dụng ph
ương pháp qui n
ạp để chứng minh
g(n)

c2
n
-b(V
ới b,c là hằng số dương thích hợp)
Gi

ả sử
g(n)

c2
n
- b đúng v
ới n
- 1, ngh
ĩa là:
g(n-1)

c2
n-1
- b
Th
ế bất đẳng thức trên vào hệ thức truy hồi ta có được :
g(n)

2(c2
n-1
– b) + 1
= c2
n
– 2b + 1

c2
n
– b
Ch
ứng minh đúng, với b


1 và h
ằng c đủ lớn để thỏa mãn điều kiện biên
V
ậy độ phức tạp tính toán của chương trình con Sort(n) là O(2
n
)
Bài t
ập 4
: Vi
ết thuật toán đệ quy nhằm xóa tất cả các phần tử có giá trị bằng x trong
dãy s
ố nguyên a[1],a[2],… ,a[n].
Function XoaM_DQ(Var n:integer;x:integer):Mang;
Var tam,j:integer;
Begin
if n>=1 then
begin
If A[n]=x then
begin
n:=n-1;
XoaM_DQ(n,x);
end
else
begin
n:=n-1;
j:=n;
XoaM_DQ(n,x);
A[n+1]:=A[j+1];
n:=n+1;

end;
end;
XoaM_DQ:=A;
End; {Funtion}
{CHƯƠNG TR
ÌNH CHÍNH
}
Bài t
ập nhóm 1B
– KHMT 2014
Trang 7
Program Xoaptmang;
Const max=100;
Type Mang=Array[1 max] of integer;
Var A:Mang;
i,n,gtxoa,gtchen:integer;
{Th
ủ tục nhập mảng}
Procedure NhapM(Var A:mang;Var n:integer);
Begin
Write('Nhap so phan tu cua mang : ');Readln(n);
For i:=1 to n do
begin
Write('Phan tu A[',i,']=');Readln(A[i]);
end;
End;
{Th
ủ tục in mảng}
Procedure InM(A:Mang;n:integer);
Begin

For i:=1 to n do Write(A[i]:4);
End;
{Hàm đ
ệ quy trả về mảng sau khi
đã thực hiện xóa các phần tử có giá trị x}
Function XoaM_DQ(Var n:integer;x:integer):Mang;
Var j:integer;
Begin
if n>=1 then
begin
If A[n]=x then
begin
n:=n-1;
XoaM_DQ(n,x);
end
else
begin
Bài t
ập nhóm 1B
– KHMT 2014
Trang 8
n:=n-1;
j:=n;
XoaM_DQ(n,x);
A[n+1]:=A[j+1];
n:=n+1;
end;
end;
XoaM_DQ:=A;
End;

BEGIN
NhapM(A,n);
Write('Mang :');
InM(A,n);
Writeln;
Write('Nhap gia tri can xoa : ');Readln(gtxoa);
Write('Mang sau khi xoa :');
InM(XoaM_DQ(n,gtxoa),n);
END.
D
ữ liệu chạy thử :
Nhap so phan tu cua mang
: 5
Phan tu A[1]=1
Phan tu A[2]=4
Phan tu A[3]=6
Phan tu A[4]=3
Phan tu A[5]=4
Mang : 1 4 6 3 4
Nhap gia tri can xoa : 4
Mang sau khi xoa : 1 6
3
Nhap so phan tu cua mang
: 5
Phan tu A[1]=1
Phan tu A[2]=3
Phan tu A[3]=6
Phan tu A[4]=4
Phan tu A[5]=3
Mang : 1 3 6 4 3

Nhap gia tri can xoa : 1
Mang sau khi xoa : 3 6
4 3
Nhap so phan tu cua mang
: 5
Phan tu A[1]=2
Phan tu A[2]=4
Phan tu A[3]=6
Phan tu A[4]=8
Phan tu A[5]=9
Mang : 2 4 6 8 9
Nhap gia tri can xoa : 6
Mang sau khi xoa : 2 4
8 9
Bài t
ập 5 :
Xét danh sách F như ph
ần lý thuyết.
Vi
ết thuật toán để liệt kê giá trị trường
info c
ủa tất cả các nút thuộc danh sách F theo thứ tự ngược, với điều kiện giá trị
Bài t
ập nhóm 1B
– KHMT 2014
Trang 9
trư
ờng info của nút
đó phải lớn hơn số nguyên x cho trước. Từ đó đánh giá độ phức
tạp của thuật toán này.

Procedure ListNguoc(F:TroNut;x:integer);
Begin
If F<> nil then
begin
ListNguoc(F^.next,x);
If F^.info>x then Write(F^.info:3);
end;
End;
Đ
ộ phức tạp tính toán của thủ tục là : O(n)
Dữ liệu chạy thử :
Danh sach :
12 8 16 10 17 12 16 14 11 10
Nhap so nguyen x : 10
Day in nguoc voi gia tri lon hon x
11 14 16 12 17 16 12
Danh sach :
12 8 16 10 17 12 16 14 11 10
Nhap so nguyen x : 16
Day in nguoc voi gia tri lon hon x
17
Bài t
ập 6 :
Vi
ết thuật toán để xóa tất cả các n
út có giá tr
ị trường info bằng x của danh
sách tăng d
ần F. Từ đó cho biết độ phức tạp của thuật toán
.

Procedure XoaGT(Var F:TroNut;x:integer);
Var p:TroNut;
Begin
If (F <> nil) and (F^.info<=X) then
begin
IF F^.info=x then
begin
XoaGT(F^.next,x);
p:=F;
F:=F^.next;
Dispose(p);
end
Else
XoaGT(F^.next,x);
Bài t
ập nhóm 1B
– KHMT 2014
Trang 10
end;
end;
End;
{CHƯƠNG TR
ÌNH CHÍNH IN NGƯỢC VÀ XÓA}
PROGRAM DanhsachLK;
Type TroNut=^Nut;
Nut = Record
info:Integer;
next:TroNut;
End;
Var F: TroNut;

x,gtxoa:integer;
{Th
ủ tục Tao 1 danh sach bat ki voi 10 phan tu
so nguyen}
Procedure TaoDs;
Var p:TroNut;
i:byte;
Begin
For i:=1 to 10 do
begin
new(p);
p^.info:=Random(20);
p^.next:=F;
F:=p;
end;
End;
{Th
ủ tục in danh sách
đúng th
ứ tự}
Procedure List(F:TroNut);
Begin
If F<> nil then
begin
Write(F^.info:3);
List(F^.next);
Bài t
ập nhóm 1B
– KHMT 2014
Trang 11

end;
End;
{Th
ủ tục in danh sách ngược với điều kiện giá trị phải lớn hơn x}
Procedure ListNguoc(F:TroNut;x:integer);
Begin
If F<> nil then
begin
ListNguoc(F^.next,x);
If F^.info>x then Write(F^.info:3);
end;
End;
{Th
ủ tục sắp xếp danh sách F theo thứ tự tăng dần}
Procedure Sort(F:TroNut);
Var tam:integer;
Begin
If (F<>nil) and (F^.next<>nil) then
begin
Sort(F^.next);
If F^.info>F^.next^.info then
begin
tam:=F^.info;
F^.info:=F^.next^.info;
F^.next^.info:=tam;
Sort(F^.next);
end;
end;
End;
{Th

ủ tục xóa tất cả các nút có giá trị bằng
X}
Procedure XoaGT(Var F:TroNut;x:integer);
Var p:TroNut;
Begin
If (F <> nil) and (F^.info<=X) then
Bài t
ập nhóm 1B
– KHMT 2014
Trang 12
begin
IF F^.info=x then
begin
XoaGT(F^.next,x);
p:=F;
F:=F^.next;
Dispose(p);
end
Else
XoaGT(F^.next,x);
end;
end;
End;
BEGIN
F:=nil;
TaoDs;
Writeln('Danh sach :');
List(F);
Writeln;
{In danh sách ngư

ợc}
Write('Nhap so nguyen x : ');Readln(x);
Writeln;
Writeln('Day in nguoc voi gia tri lon hon x');
ListNguoc(F,x);
{In danh sách F theo th
ứ tự tăng dần}
Writeln;
Writeln('Danh sach F theo thu tu tang dan');
Sort(F);
List(F);
{Xóa ph
ần tử bằng x trong danh sách}
Writeln;
Write('Nhap gia tri can xoa : ');Readln(gtxoa);
Bài t
ập nhóm 1B
– KHMT 2014
Trang 13
XoaGT(F,gtxoa);
List(F);
END.
D
ữ liệu chạy thử
Danh sach F theo thu tu
tang dan
8 10 10 11 12 12 14 16 16
17
Nhap gia tri can xoa : 8
10 10 11 12 12 14 16 16

17
Danh sach F theo thu tu
tang dan
8 10 10 11 12 12 14 16 16
17
Nhap gia tri can xoa : 12
8 10 10 11 14 16 16 17
Danh sach F theo thu tu
tang dan
8 10 10 11 12 12 14 16 16
17
Nhap gia tri can xoa : 17
8 10 10 11 12 12 14 16 16
Bài t
ập 7 :
Vi
ết thuật toán để điều chỉnh cây T bất kì thành 1 đống ( Dùng đệ quy)
Procedure DieuChinh(T:TroNut);
Var tam:Integer;
Begin
If (T<>nil) and ((T^.left <> nil) or (T^.right<>nil)) then
If (T^.left = nil) and (T^.right<>nil) then
begin
DieuChinh(T^.right);
If T^.info<T^.right^.info then Swap(T^.info,T^.right^.info);
DieuChinh(T^.right);
end
Else if (T^.right = nil) and (T^.left<>nil) then
begin
DieuChinh(T^.left);

If T^.info<T^.left^.info then Swap(T^.info,T^.left^.info);
DieuChinh(T^.left);
end
else { trư
ờng hợp : T^.left<>nil or T^.right<>nil }
begin
DieuChinh(T^.right);
Bài t
ập nhóm 1B
– KHMT 2014
Trang 14
DieuChinh(T^.left);
If T^.left^.info>T^.right^.info then
begin
If T^.info<T^.left^.info then
begin
Swap(T^.info,T^.left^.info);
DieuChinh(T^.left);
end;
end
Else
{Trư
ờng
hợpT^.left^.info<=T^.right^.info }
begin
If T^.info<T^.right^.info then
begin
Swap(T^.info,T^.right^.info);
DieuChinh(T^.right);
end;

end;
end;
End;
{CHƯƠNG TR
ÌNH CHÍNH
}
PROGRAM Cay;
Type TroNut=^Nut;
Nut = Record
info:Integer;
left,right:TroNut;
End;
Var T:TroNut;
{Hàm tr
ả về 1 nút trên cây có giá trị x}
Function TimNut(T:TroNut;x:Integer):TroNut;
Var p:TroNut;
Begin
Bài t
ập nhóm 1B
– KHMT 2014
Trang 15
If T=nil then TimNut:=nil
else if T^.info=x then TimNut:=T
else
begin
p:=TimNut(T^.left,x);
If p<> nil then TimNut:=p
else TimNut:=TimNut(T^.right,x);
end;

End;
{Hàm tạo 1 nút trên cây}
Function TaoNut(x:Integer):TroNut;
Var p:TroNut;
Begin
If x<>-1 then
begin
New(p);
p^.info:=x;
p^.left:=nil;
p^.right:=nil;
TaoNut:=p;
end
else TaoNut:=nil;
End;
{Th
ủ tục thêm 1 nút trong cây}
Procedure ThemNut(goc,trai,phai:integer);
Var p:TroNut;
Begin
p:=TimNut(T,goc);
If p=nil then Exit;
p^.left:=TaoNut(trai);
p^.right:=TaoNut(phai);
End;
Bài t
ập nhóm 1B
– KHMT 2014
Trang 16
{Th

ủ tục tạo cây}
Procedure TaoCay(Var T:TroNut);
Begin
new(T);T^.info:=1;
ThemNut(1,2,3);
ThemNut(2,4,5);
ThemNut(3,6,7);
ThemNut(4,8,9);
End;
{Thủ tục hiển thị Cây}
Procedure HienThiCay(T:TroNut);
Begin
If (T<>nil) and ((T^.left<>nil)or (T^.right<>nil)) then
begin
Write(T^.info,': ');
if T^.left<> nil then Write(T^.left^.info,' ')
else Write('-');
if T^.right<> nil then Write(T^.right^.info,' ')
else Write('-');
Writeln;
HienThiCay(T^.left);
HienThiCay(T^.right);
end;
End;
{Hàm ki
ểm tra cây T là 1 đống}
Function LaDong(T:TroNut):Boolean;
Begin
IF (T=nil) or ((T^.left=nil) and (T^.right=nil)) then LaDong:=True
else

begin
If T^.left=nil then LaDong:=(T^.info>T^.right^.info) and
LaDong(T^.right)
Bài t
ập nhóm 1B
– KHMT 2014
Trang 17
else if T^.right=nil then LaDong:=(T^.info>T^.left^.info) and
LaDong(T^.left)
else LaDong:=(T^.info>T^.right^.info) and LaDong(T^.right) and
(T^.info>T^.left^.info) and LaDong(T^.left);
end;
End;
{Th
ủ tục
đổi chỗ 2 giá trị}
Procedure Swap(var a,b:integer);
Var tam:Integer;
Begin
tam:=a;
a:=b;
b:=tam;
End;
{Th
ủ tục điều chỉnh cây T để cây T trở thành Đống}
Procedure DieuChinh(T:TroNut);
Begin
If (T<>nil) and ((T^.left <> nil) or (T^.right<>nil)) then
If (T^.left = nil) and (T^.right<>nil) then
begin

DieuChinh(T^.right);
If T^.info<T^.right^.info then Swap(T^.info,T^.right^.info);
DieuChinh(T^.right);
end
Else if (T^.right = nil) and (T^.left<>nil) then
begin
DieuChinh(T^.left);
If T^.info<T^.left^.info then Swap(T^.info,T^.left^.info);
DieuChinh(T^.left);
end
Else { trư
ờng hợp : T^.left<>nil or T^.right<>nil }
begin
Bài t
ập nhóm 1B
– KHMT 2014
Trang 18
DieuChinh(T^.right);
DieuChinh(T^.left);
If T^.left^.info>T^.right^.info then
begin
If T^.info<T^.left^.info then
begin
Swap(T^.info,T^.left^.info);
DieuChinh(T^.left);
end;
end
Else {Trư
ờng hợpT^.left^.info<=T^.right^.info }
begin

If T^.info<T^.right^.info then
begin
Swap(T^.info,T^.right^.info);
DieuChinh(T^.right);
end;
end;
end;
End;
BEGIN
T:=nil;
TaoCay(T);
Writeln('Cay T:');
HienThiCay(T);
Writeln;
Writeln('Kiem tra cay T co la dong khong? : ',LaDong(T));
DieuChinh(T);
Writeln('Cay T sau dieu chinh');
HienThiCay(T);
Writeln;
Writeln('Kiem tra cay T co la dong khong? : ',LaDong(T));
Bài t
ập nhóm 1B
– KHMT 2014
Trang 19
END.
D
ữ liệu chạy thử :
Cay T:
1: 2 3
2: 4 5

4: 8 9
3: 6 7
Kiem tra cay T co la dong khong? : FALSE
Cay T sau dieu chinh
9: 8 7
8: 4 5
4: 2 1
7: 6 3
Kiem tra cay T co la dong khong? : TRUE
Bài t
ập 8:
Bài toán xác su
ất
1. Phát bi
ểu bài toán:
Tính giá tr
ị xác suất P(i, j) (i, j: byte).
Bi
ết rằng:
= 1 n
ếu i=0 và j>0
P(i, j) = (P(i-1, j)+ P(i, j-1))/2 n
ếu i>0 và j>0
= 0 n
ếu ngược lại
2. Phương pháp th
ực hiện, sử dụng phương pháp quy hoạch động với 4 bước là:
Bước 1: Phân tích bài toán
Gọi P(r,s) là bài toán xác suất để tính giá trị xác suất
=> Bài toán ban đầu P(i,j)

Trong đó:
r: tham số thứ nhất, 0
≤ r ≤ i c
ủa bài toán P(r,s)
s: tham số thứ hai, 0
≤ s ≤ j c
ủa bài toán P(r,s)
⇒ Cần tìm P(r,s) là giá trị xác suất của bài toán P(r,s).
Bước 2: Giải pháp đệ quy
- Nếu r>0 và s>0 thì P(r,s) = (P (r-1,s) + P ( r, s-1))/2
- Nếu r=0 và s>0 thì P(r,s) = 1
Bài t
ập nhóm 1B
– KHMT 2014
Trang 20
- Nếu r>=0 và s=0 thì P(r,s) = 0
Bước 3: Lập bảng
- Sử dụng mảng 2 chiều: a[r,s] = P[r,s] với r=0 i và s=0 j.
- Cụ thể:
+ a[0,s] = 1, ∀s > 0 (s = 1 j)
+ a[r,0] =0, ∀r ≥ 0 (r = 0 i)
+ a[r,s] = (a[r-1,s] + a[r,s-1])/2 (r=1 i và s=1 j)
Bước 4. Tổng hợp kết quả P(i,j) = a[i,j]
CODE TÍNH GIÁ TR
Ị XÁC SUẤT P(i,j)
program tinh_xac_suat_p;
var a:array[0 10,0 10] of real;
i,j:byte;
Function P(i,j:byte): real;
Var r,s:byte;

Begin
for r:=0 to i do
for s:=0 to j do
Begin
if (r=0) and (s>0) then a[r,s]:=1
else
if (r>0) and (s>0) then
a[r,s]:=(a[r-1,s]+a[r,s-1])/2
else a[r,s]:=0;
End;
p:=a[r,s];
End;
BEGIN
write('nhap cac gia tri i:'); readln(i);
write('nhap cac gia tri j:');readln(j);
write(' Gia tri xac suat do la: ',P(i,j):4:2);
END.
Bài t
ập 9 :
Bài toán túi xách
Bài t
ập nhóm 1B
– KHMT 2014
Trang 21
1. Phát bi
ểu bài toán:
Phát biểu bài toán: Một cái kho chứa n loại đồ vật có kích thước và giá trị khác
nhau. Cụ thể: Loại đồ vật i (i=1 n) có: kích cỡ m[i] ∈ N*; gía trị c[i] ∈ R; số lượng:
không hạn chế
Một tên trộm mang theo chiếc túi có kích cỡ là p ∈ N*. Vậy hắn phải chọn lựa

một danh sách các đồ vật sẽ mang đi như thế nào để cho tổng giá trị lấy cắp được là
lớn nhất.
Tức: Tìm x[1], x[2], , x[n] (với x[i] ∈ N : số lượng loại đồ vật thứ i cần lấy)
sao cho: ∑x[i].m[i] ≤ p và ∑x[i].c[i] đạt giá trị cực đại.
Input: M
ột cái túi chứa n loại đồ vật có kích thước và giá trị khác nhau.
Cụ thể: Loại đồ vật i (i=1 n) có:
- Kích c
ỡ m[i]
∈ N*
- Giá tr
ị c[i]
∈ R
- S
ố lượng: không hạn chế
Có th
ể biểu diễn dữ liệu vào
thông qua b
ảng nh
ư sau:
Lo
ại đồ vật i
1
2

n
Kích c
ỡ M[i]
M[1]
M[2]


M[n]
 N*
Giá tr
ị C[i]
C[1]
C[2]

C[n]
 R
S
ố lượng các loại đồ vật không hạn chế.
p ∈ N* là kích c
ỡ chiếc túi
(M
ột tên trộm mang theo chiếc túi có kích cỡ là p
∈ N*. V
ậy h
ắn phải chọn lựa
m
ột danh sách các
đồ vật sẽ mang đi như thế nào để cho tổng giá trị lấy cắp được là
l
ớn nhất.)
Output: Tìm x[1], x[2], , x[n] (v
ới x[i]
∈ N: s
ố lượng loại đồ vật thứ i cần
l
ấy) sao cho:

Σx[i].m[i] ≤ p và Σx[i].c[i] đ
ạt giá trị cực đại.
2. Phương pháp th
ực hiện, sử dụng phương pháp quy hoạch động với 4 bước là:

ớc 1: Phân tích bài toán
- G
ọi P(r, s) là bài toán chiếc túi xách, với:
r ∈ N*: kích c
ỡ chiếc túi
s ∈ N*: s
ố các loại
đ
ồ vật khác nhau
=>bài toán ban đ
ầu là P(p, n)
- Các giá tr
ị cần tìm:
l[r,s]: giá trị cực đại ∑x[i].c[i] của bài toán P(r, s)
u[r,s]: s
ố lượng loại đồ vật s tối
ưu c
ần lấy (tức: x[s]) của bài
toán P(r, s)
Bài t
ập nhóm 1B
– KHMT 2014
Trang 22

ớc 2: Xây dựng giải pháp

đệ quy
- Trư
ờng hợp chung:
s > 1
l[r, s] = max { k∗c[s] + l[r – k∗m[s], s-1] } (1) (0 ≤ k ≤ r div m[s])
= k’∗c[s] + l[r – k’∗m[s], s-1]
u[r, s] = k’
- Trư
ờng hợp suy biến
: s = 1
u[r, 1] = r div m[1]
l[r, 1] = u[r, 1]∗c[1]
{(1) có ngh
ĩa là: + k
∗c[s] là giá tr
ị mang lại khi lấy k
đồ vật thứ
s,
+ r – k∗m[s] kích thư
ớc của cái túi giảm đi k
∗m[s],
+ (s - 1) s
ố loại đồ vật giảm đi 1
bài toán lớn được tính thông qua bài toán nhỏ hơn}

ớc 3: Lập bảng
Procedure LapBang;
Begin
For s:=1 to n do
For r:=0 to p do

If s=1 then Tính u[r, 1] và l[r, 1]
else Tính u[r, s] và l[r, s];
End;
Đ
ộ phức tạp tính toán là: O(
np
2
)

ớc 4: Tổng hợp kết quả
Procedure TongHop;
Begin
r:=p;
For s:=n downto 1 do
Begin
x[s]:= u[r,s];
r:= r – x[s].m[s];
End;
End;
Đ
ộ phức tạp tính toán: O(n)
Bài t
ập nhóm 1B
– KHMT 2014
Trang 23
CODE BÀI TOÁN CHI
ẾC TÚI XÁCH
D
ữ liệu vào được lưu trong file
Input.txt g

ồm 2 dòng:
+ Dòng
đầu là số nguyên n (số đồ vật) và p (cỡ của túi xách)
+ Dòng i+1 (1<=i<=n) ghi 2 s
ố nguyên dương m[i], c[i].
program BT_CTX;
const input = 'input.txt';
nmax = 100;
pmax = 100;
var u,l: array[1 pmax,1 nmax] of integer;
m,c, x: array[1 nmax] of integer;
i,n,p: integer;
procedure Doc_DL;
var f: text;
i: integer;
begin
Assign(f,input);
Reset(f);
readln(f,n,p);
for i:=1 to n do readln(f,m[i],c[i]);
close(f);
end;
procedure Lap_Bang;
var r, s, k, k1, tam, max : integer;
begin
for s:=1 to n do
for r:=0 to p do
if s= 1 then
begin
u[r,1]:= r div m[1];

l[r,1]:=u[r,1] * c[1];
end
else
Bài t
ập nhóm 1B
– KHMT 2014
Trang 24
begin
k1:= 0;
max:= l[r,s-1];
for k:=1 to r div m[s] do
begin
tam:= k*c[s] + l[r-k*m[s],s-1];
if tam > Max then
begin
max:=tam;
k1:=k;
end;
end;
l[r,s]:=max;
u[r,s]:=k1;
end;
end;
Procedure TongHop_KQ;
var r,s: integer;
begin
r:=p;
for s:=n downto 1 do
begin
x[s]:= u[r,s];

r:=r- x[s]*m[s];
end;
for s:=1 to n do
writeln('Do vat ', s, ' can lay ', x[s], ' cai');
writeln('Gia tri toi uu: ', l[p,n]);
end;
begin
Doc_DL;
Bài t
ập nhóm 1B
– KHMT 2014
Trang 25
Lap_Bang;
TongHop_KQ;
readln;
end.
Kết quả chạy thử
D
ữ liệu đầu vào:
5 8
2 3
1 4
2 5
4 5
1 5
D
ữ liệu đầu vào:
2 8
2 3
3 4

D
ữ liệu đầu vào:
7 15
2 3
3 4
2 5
4 5
8 5
4 7
3 6
K
ết quả:
Do vat 1 lay 0 cai
Do vat 2 lay 0 cai
Do vat 3 lay 0 cai
Do vat 4 lay 0 cai
Do vat 5 lay 8 cai
Gia tri toi uu : 40
K
ết quả:
Do vat 1 lay 4 cai
Do vat 2 lay 0 cai
Gia tri toi uu : 12
K
ết quả:
Do vat 1 lay 0 cai
Do vat 2 lay 0 cai
Do vat 3 lay 6 cai
Do vat 4 lay 0 cai
Do vat 5 lay 0 cai

Do vat 6 lay 0 cai
Do vat 7 lay 1 cai
Gia tri toi uu : 36
Bài t
ập 10 :
Bài toán phép nhân t
ổ hợp nhiều ma trận
1. Phát bi
ểu bài toán:
Cần tính M = M
1
×M
2
× ×M
n
Trong đó: M
i
là ma trận cấp m[i-1]×m[i] (i=1 n)
Hãy xác
đ
ịnh thứ tự thực hiện các phép nhân sao cho số phép tính là tối thiểu.
C
ần tính M = M
1
×M
2
× ×M
n
, trong đó: M
i

là ma tr
ận cấp m[i
-1]×m[i] (i=1 n),
thể hiện điều này thông qua bảng sau, đây cũng chính là thông tin vào của bài toán.
Input: m
ảng m[i], i = 0 n
n: s
ố các ma trận
C
ấp của các
ma tr
ận
I
0
1

n
m[i]
m[0]
m[1]

m[n]

×