Professional Documents
Culture Documents
II.
}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.
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.
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();
}