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
Bư
ớc 1 : Suy đoán nghiệm g(n)=O(2
n
)
Bư
ớ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à:
Bư
ớ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
Bư
ớ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}
Bư
ớ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
)
Bư
ớ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]