You are on page 1of 7

I.

Thu t toan quay lui tim ng i cua thi


Bai toan: Cho thi G=(V,E) co hng ho c v hng s,f V.
Tim tt ca cac ng i t s n f
Y tng: - Tim x1 x2 xm sao cho
x1 = s la inh xut phat
xm = f la inh kt thuc
- xi # xj vi moi i#j; (x1; xi+1) EG
Code:
#include<conio.h>
#include<iostream>
#include<fstream>
using namespace std;
class Dothi
{
public:
int n;
int A[200][200];
void LoadFile(char *fname)
{
ifstream is(fname);
is >>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
is >> A[i][j];
is.close();
}
void Print()
{
cout << "\n Ma tran ke cua do thi \n";
for(int i=1;i<=n;i++)
{
cout <<endl;
for(int j=1;j<=n;j++)
cout << A[i][j]<<"";
}
}
bool Next(int *x, int k, int t)
{
for(int i=1;i<=k;i++)
if(x[k]==t) return false;
return true;
}
void TRY(int *x, int k,int f)
{
if(x[k]==f)
{
cout << "\n";
for(int i=1;i<k;i++)
cout<<x[i]<<"-->";
cout << x[k];
return;
}
for(int t=1;t<=n;t++)
if(A[x[k]][t]==1&&Next(x,k,t))
{
x[k+1]=t;
TRY(x,k+1,f);
}
}
void Path()
{
int s,f,x[100];
cout << "\n Nhap dinh xuat phat:"; cin >>s;
cout << "\n Nhap dinh ket thuc:"; cin >>f;
cout << "\n Duong di cua do thi:";
x[1]=s;
TRY(x,1,f);
}
};
int main()
{
Dothi G;
G.LoadFile("G.txt");
G.Print();
G.Path();
getch();
}

II.

Thu t toan Tham lam ba l theo th t


Bai toan: Cho n v t co kich thc a1,a2,,an va gia tri b1,b2,,bn. Ba l kich thc M.
Ly cac v t bo vao ba l sao cho tng kich thc khng vt qua M
Y tng: Tham lam theo thu t ty l gia tri/kich thc
B1: Sp xp theo ty l gia tri/kich thc giam dn
B2: Xet cac v t ln lt theo ty l v t nao bo va thi ly
Minh hoa: Ta co
V t
1
2
3
4
5
6
Gia tri
80
10
6
70
70
90
0
Kich thc
40
10
3
30
40
50
0
Ty l
2
1
2
2.333
1.7
1.
5
8
B1: Sp xp ty l giam dn
V t
4
1
3
6
5
2
Gia tri
70
80
60
90
70
10
Kich thc
30
40
30
50
40
10
B2: M=130
V t
Gia tri
Kich thc
Tng kich thc
Tng gia tri
Chon
4
70
30
70
30
X
1
80
40
150
70
X
3
60
30
210
100
X
6
90
50
210
100
5
70
40
210
100
2
10
10
220
110
X
Kt lu n: Tng kich thc: 110; Tng gia tri 220.
Chon v t 4 co kich thc 30 va gia tri 70
Chon v t 1 co kich thc 40 va gia tri 80
Chon v t 3 co kich thc 30 va gia tri 60
Chon v t 2 co kich thc 10 va gia tri 10
Code:
#include <conio.h>
#include <stdio.h>
struct Obj
{ int id,w,v;
float t;
};
void Nhap(int &n, Obj *&O)
{
printf("Nhap so do vat:");
scanf("%d",&n);
O = new Obj[n+1];
for(int i=1;i<=n;i++)
{
printf("Nhap do vat thu %d:",i);
printf("\n Kich thuoc:");
scanf("%d", &O[i].w);
printf("\n Gia tri:");
scanf("%d", &O[i].v);
O[i].id = i;
O[i].t = O[i].v/float(O[i].w);
}
}
void Sapxep(int n, Obj *O)
{
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
if(O[i].t<O[j].t || (O[i].t==O[j].t && O[i].w<O[j].w))
{
Obj t=O[i];
O[i]=O[j];
O[j]=t;
}
}
void Xuat(int n, Obj *O)
{ for(int i=1;i<=n;i++)
printf("\n Vat %d co kich thuoc %d va gia tri %d",O[i].id,O[i].w,O[i].v);
}
void Balo(int n, Obj *O, int M)
{
int K=0,G=0;
for(int i=1;i<=n;i++)
if(K+O[i].w <= M)
{
printf("\n Chon vat %d co kich thuoc %d va gia tri %d",O[i].id,O[i].w,O[i].v);
K += O[i].w;
G += O[i].v;
}
printf("\n Tong kich thuoc %d",K);
printf("\n Tong gia tri %d",G);
}
int main()
{
Obj *O;
int n,M;
Nhap(n,O);
printf("\n Cac vat truoc khi sap xep \n"); Xuat(n,O);
Sapxep(n,O);
printf("\n Cac vat sau khi sap xep\n"); Xuat(n,O);
do{ printf("\n\n Nhap kich thuoc ba lo:");
scanf("%d", &M);
Balo(n,O,M);

}while(M);
getch();
}
III. Thu t toan Tham lam ong thung theo th t
Bai toan: Co n v t kich thc ln lt la a1,a2,.an va thung co kich thc M (ai<= M vi moi i = 1,n). ong co v t vao thung sao cho s thung it nht
Y tng: - Sp xp cac v t co kich thc giam dn
- Tham lam duy t cac v t t ln n be: Nu cac thung a co ma co thung bo c ta bo vao; Ngc lai ta thm thung mi
Minh hoa: Cho cac v t co kich thc
V t
1
2
3
4
5
6
7
8
9
10
11
12
13
Va thung M=11
Kich thc
4
7
2
8
1
6
9
6
4
3
5
2
2
B1: Sp xp giam dn kich thc
V t
7
4
2
6
8
11
1
9
10
3
12
13
5
Kich thc
9
8
7
6
6
5
4
4
3
2
2
2
1
B2:
V
KT
Cac thung
Sp xp
Chon
7
9
(1,9)
(1,9)
1
4
8
(1,9),(2,8)
(2,8),(1,9)
2
2
7
(2,8),(1,9),(3,7)
(3,7),(2,8),(1,9)
3
6
6
(3,7),(2,8),(1,9),(4,6)
(4,6),(3,7),(2,8),(1,9)
4
8
6
(4,6),(3,7),(2,8),(1,9),(5,6)
(5,6),(4,6),(3,7),(2,8),(1,9)
5
11
5
(4,6),(5,11),(3,7),(2,8),(1,9)
(4,6),(3,7),(2,8),(1,9),(5,11)
5
1
4
(4,6),(3,11),(2,8),(1,9),(5,11)
(4,6),(2,8),(1,9),(3,11),(5,11)
3
9
4
(4,10),(2,8),(1,9),(3,11),(5,11)
(2,8),(1,9),(4,10),(3,11),(5,11)
4
10
3
(2,11),(1,9),(4,10),(3,11),(5,11)
(1,9),(4,10),(2,11), (3,11),(5,11)
2
3
2
(1,11),(4,10),(2,11),(3,11),(5,11)
(4,10),(1,11),(2,11),(3,11),(5,11)
1
12
2
(4,10),(1,11),(2,11),(3,11),(5,11),(6,2)
(6,2),(4,10)(1,11),(2,11),(3,11),(5,11)
6
13
2
(6,4),(4,10),(1,11),(2,11),(3,11),(5,11)
(6,4),(4,10)(1,11),(2,11),(3,11),(5,11)
6
5
1
(6,4),(4,11),(1,11),(2,11),(3,11),(5,11)
(6,4),(1,11),(2,11),(3,11),(4,11),(5,11)
4
Kt lu n: Dung 6 thung la it nht
Thung 1: ong 11 gom v t 7 va v t 3
Thung 2: ong 11 gom v t 4 va v t 10
Thung 3: ong 11 gom v t 2 va v t 1
Thung 4: ong 11 gom v t 6 va v t 9 va v t 5
Thung 5: ong 11 gom v t 8 va v t 11
Thung 6: ong 4 gom v t 12 va v t 13
Code:
#include<conio.h>
#include<iostream>
#include<algorithm>
using namespace std;
struct Obj
{
int index;
int weight;
};
bool sosanh(Obj x, Obj y)
{ return x.weight < y.weight;
}
class Bin
{
int n;
public:
Obj * O;
void Input(); // Nhap du lieu
void FF(int M); // Dong thung kich thuoc M
void Output();
};
void Bin::Input()
{
cout << "\n Nhao so do vat:";
cin >> n;
O=new Obj[n+5];
for(int i=1;i<=n;i++)
{ cout <<"Kich thuoc A[" <<i<< "]";
cin >> O[i].weight;
O[i].index = i;
}
sort(O+1, O+n+1, sosanh); //Sap xep
}
void Bin::FF(int M)
{
Obj *T=new Obj[n+5];
int k=0;
int *chon= new int [n+5];
for(int i=1;i<=n;i++)
{
int j;
for(j=1;j<=k;j++)
if(T[j].weight + O[i].weight <=M) break;
if(j<=k)
{
chon[O[i].index] = T[j].index;
T[j].weight += O[i].weight;
}
else
{
k++;
T[k].index = k;
T[k].weight = O[i].weight;
chon[O[i].index] = k;
}
sort(T+1,T+k+1,sosanh);

}
cout << "\n So thung it nhat:"<<k;
for(int i=1;i<=k;i++)
{
cout <<"\n Thung"<<T[i].index<<"Trong so"<<T[i].weight<<"gom";
for(int j=1;j<=n;j++)
if(chon[j] = T[i].index) cout <<j<<"\t";
}
}
void Bin::Output()
{
for(int i=1;i<=n;i++)
cout <<"\n Vat "<<O[i].index<<" kich thuoc "<<O[i].weight;
}
int main()
{
int M;
Bin B;
B.Input();
cout <<"\n Danh sach ca do vat sau khi sap xep \n\n";
B.Output();
do{
cout <<"\n Nhap kich thuoc thung";
cin >>M;
B.FF(M);
}while(M);
getch();
}
IV.

Thu t toan Quy hoach ng i tin


Bai toan: Cho n m nh gia tin a1,a2,.an. Mun i m tin sao cho s tin la it nht.
Y tng: t C[n,m] la s t it nht
Khi i m nh gia a1,a2,.an.cho M
Ta co C[0,j] = vi moi i = 1,m
C[i,0] = 0
C[i,j]=C[i-1,j] nu ai>j
C[i,j]=Min(C[i-1,j],1+C[i,j-ai]) nu ai<=j
Minh hoa: Co cac m nh gia 4 7 2 8 1 6
M=23
C
0
1
2
3
4
5
6
7
8
9
10
*
0

4
0

7
0

1
2

2
0

2
1
2
2
3
8
0

2
1
1
2
2
1
0
1
1
2
1
2
2
1
1
2
2
6
0
1
1
2
1
2
1
1
1
2
2
Kt lu n: Co 3 t it nht gm 7+8+8 = 23
Code:
#include <conio.h>
#include <stdio.h>
void Nhap(int &n, int *A)
{
printf("Nhap so menh gia n=");
scanf("%d", &n);
for(int i=1;i<=n;i++)
{
printf("\n A[%d]=",i);
scanf("%d",&A[i]);
}
}
int min(int a, int b)
{
return a<b?a:b;
}
void BuocThuan(int n, int *A, int M, int C[10][100])
{
for(int j=0;j<=M;j++) C[0][j] = M+1;
C[0][0]=0;
for(int i=1;i<=n;i++)
for(int j=0;j<=M;j++)
{
if(A[i]>j) C[i][j]=C[i-1][j];
else C[i][j]= min(C[i-1][j],1+C[i][j-A[i]]);
}
}
void Inmatran(int n, int M, int C[10][100])
{
for(int i=0;i<=n;i++)
{
printf("\n");
for(int j=0;j<M;j++)
printf("%3d",C[i][j]);
}
}
void BuocNghich(int n, int M, int *A, int C[10][100])
{
if(C[n][M]==0) return;
while(C[n][M] = C[n-1][M]) n--;
BuocNghich(n,M-A[n],A,C);
printf("%d", A[n]);
}
int main()

11

2
2
2
2
2

12

3
3
3
2
2
2

13

3
3
3
2

14

2
2
2
2
2

15

3
3
2
2
2

16

4
4
3
2
2
2

17

4
3
3
3

18

3
3
3
3
3

19

4
4
3
3
3

20

5
5
4
3
3
3

21

3
3
3
3
3

22

4
4
3
3
3

23

5
4
3
3
3

{
int n, M, A[100], C[10][100];
Nhap(n,A);
printf("Nhap so tien muon doi M=");
scanf("%d", &M);
BuocThuan(n,A,M,C);
printf("\n\n Ma tran quy hoach dong \n\n");
Inmatran(n,M,C);
if(C[n][M]==M+1)
printf("\n\n Khong doi duoc");
else{
printf("\n So to tien it nhat %d \n", C[n][M]);
printf("%d",M);
BuocNghich(n,M,A,C);
printf("\b\b\b");
}
getch();
}
V.

Thu t toan Quy hoach ng Ba l


Bai toan: Cho n v t co kich thc la nguyn dng va gia tri ln lt
V t
1
2
..
.
n
Kich thc
a1
a2
..
.
an
Gia tri
b1
b2
..
.
bn
M t ba l kich thc M nguyn dng. Hay ly v t bo vao ba l sao cho tng kich thc =<M con tng gia tri n Max.
Y tng: t C[n,m] la gia tri thu c ln nht, khi xp cac v t v1,v2,.vn vao ba l M. Ta co
C[i,0] = 0
C[0,j] = 0
C[i,j] = C[i-1,j] = Max(C[i-1,j],bj+C[i-1,j-a[i]]) Nu j>=a[i]
Minh hoa: M=16
V t
1
2
3
4
5
6
Kich thc
3
4
5
3
2
4
Gia tri
7
8
9
6
2
7
Ta co bang
C
0
1
2
3
4
5
6
7
8
9
10
11
12
13
*
0
0
0
0
0
0
0
0
0
0
0
0
0
0
7
3
0
0
0
7
7
7
7
7
7
7
7
7
7
7
8
4
0
0
0
7
8
8
8
15
15
15
15
15
15
15
9
5
0
0
0
7
8
9
9
15
16
17
17
17
24
24
6
3
0
0
0
7
8
9
13
15
16
17
21
22
24
24
2
2
0
0
2
7
8
9
13
15
16
17
21
22
24
24
7
4
0
0
2
7
8
9
13
15
16
17
21
22
24
24
Ngang =3: giong hang,gi nguyn c t 0 n 2 t hang trn xung, kt qua tip theo = gia tri hang trn c t 0 + gia tri C, tng t.
Ngang =4: giong hang, gi nguyn c t 0 n 3 t hang trn xung
Cach ly: Ly dong cui trc, tr kich thc dong cui(4) trn hang C=12, ly gia tri ln nht c t 12, u tin t trn xung(C= 9); -5 c t C=7.
Kt lu n: Tng gia tri ln nht la 31
Ly v t 6 kich thc 4 gia tri 7
Ly v t 3 kich thc 5 gia tri 9
Ly v t 1 kich thc 3 gia tri 7
Ly v t 2 kich thc 4 gia tri 8
Code:
#include<conio.h>
#include<stdio.h>
#include<string.h>
typedef int Matran[500][500];
int max(int a, int b)
{ return a>b?a:b;
}
void Nhap(int &n, int *a, int *b)
{
printf("Nhap so do vat n=");
scanf("%d", &n);
for(int i=1;i<=n;i++)
{
printf("Kich thuoc a[%d] =", i);
scanf("%d", &a[i]);
printf("Gia tri b[%d] =", i);
scanf("%d", &b[i]);
}
}
void BuocThuan(int n, int *a, int *b, int M, Matran &C)
{
for(int j=0;j<=M;j++)
C[0][j]=0;
for(int i=1;i<=n;i++)
for(int j=0;j<=M;j++)
if(j<a[i]) C[i][j]=C[i-1][j];
else C[i][j]=max(C[i-1][j],b[i]+C[i-1][j-a[i]]);
}
void BuocNghich(int n, int *a, int *b, int M, Matran &C)
{
if(C[n][M]==0) return;
while (C[n][M]==C[n-1][M]) n--;
BuocNghich(n-1,a,b,M-a[n],C);
printf("\n Chon vat %d kich thuoc %d gia tri %d",n,a[n],b[n]);
}
void Inmatran(int n, int M, Matran &C)
{
for(int i=0;i<=n;i++)
{
printf("\n");
for(int j=0;j<=M;j++)
printf("%3d", C[i][j]);
}

14
0
7
15
24
24
26
28

15
0
7
15
24
30
30
30

16
0
7
15
24
30
30
31

}
int main()
{
int n, a[500], b[500], M;
Matran C;
Nhap(n,a,b);
do {
printf("\n\n Nhap kich thuoc ba lo:");
scanf("%d", &M);
if(M==0) return 0;
BuocThuan(n,a,b,M,C);
printf("\n Ma tran quy hoach dong \n");
Inmatran(n,M,C);
printf("\n Tong gia tri thu duoc lon nhat %d", C[n][M]);
BuocNghich(n,a,b,M,C);
}while(1);
getch();
}
VI.
Thu t toan Quy hoach ng xu con chung dai nht
Bai toan: Cho 2 xu ky t x,y. Hay tim xu con chung dai nht cua x va y bng cach xoa i it nht nhng gi nguyn th t cua x va y.
Y tng: Thay vi i tim xu con chung dai nht, ta i tim dai xu con chung dai nht
t n =|x| ; m = |y|
Cij la dai xu con chung dai nht x1x2..xi va y1y2.yi
C[0,j]=0 ; C[i,0] = 0
C[i,j] = 1+C[i-1,j-1] nu xi=yi
Max(C[i-1,i],C[i,j-1]) nu xi#yi
Minh hoa: ATAGXXGATT
XGAAXTTGAX
C
*
A
T
A
G
X
X
G
A
T
T
*
0
0
0
0
0
0
0
0
0
0
0
X
0
0
0
0
0
1
1
1
1
1
1
G
0
0
0
0
1
1
1
2
2
2
2
A
0
1
1
1
1
1
1
2
3
3
3
A
0
1
1
2
2
2
2
2
3
3
3
X
0
1
1
2
2
3
3
3
3
3
3
T
0
1
2
2
2
3
3
3
3
4
4
T
0
1
2
2
2
3
3
3
3
4
5
G
0
1
2
2
3
3
3
4
4
4
5
A
0
1
2
3
3
3
3
4
5
5
5
X
0
1
2
3
3
4
4
4
5
5
5
(Giong i,j ly hang trn c t i-1 c ng thm 1, nu khac ly max ng cheo )
Kt lu n: dai xu con chung dai nht la 5: XGATT
Code:
#include <conio.h>
#include <stdio.h>
#include <string.h>
typedef int Matran[100][100];
int max(int a, int b)
{
return a>b?a:b;
}
void BuocThuan(char *x, int n, char *y, int m, Matran &C)
{
for(int j=0;j<=m;j++)
C[0][j]=0;
for(int i=0;i<=n;i++)
C[i][0]=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(x[i]==y[j]) C[i][j]=1+C[i-1][j-1];
else C[i][j]= max(C[i-1][j],C[i][j-1]);
}
void Inmatran(int n, int m, Matran &C, char *x, char *y)
{
printf("\n");
for(int j=0;j<=m;j++)
printf("%5c",y[j]);
for(int i=0;i<=n;i++)
{
printf("\n %5c", x[i]);
for(int j=0;j<=m;j++)
printf("%5d",C[i][j]);
}
}
void BuocNghich(int n, int m, char *x, Matran &C)
{
if(C[n][m]==0) return;
while (C[n][m]==C[n-1][m]) n--;
while (C[n][m]==C[n][m-1]) m--;
BuocNghich(n-1,m-1,x,C);
printf("%c",x[n]);
}
int main()
{
char x[100],y[100];
int n,m;
Matran C;
printf ("\n Nhap xau x:");
fflush(stdin);
gets(x+1);
printf ("\n Nhap xau y:");
fflush(stdin);

gets(y+1);
n=strlen(x+1);
m=strlen(y+1);
BuocThuan(x,n,y,m,C);
printf("\n\n Ma tran quy hoach dong \n");
Inmatran(n,m,C,x,y);
printf("\n\n Do dai xau con dai nhat %d \n\n", C[n][m]);
BuocNghich(n,m,x,C);
getch();
}

You might also like