86
Bài 39 + Câu a : #include <iostream.h> #include <stdlib.h> const max=30; //Nhập mảng ngẫu nhiên void input(int a[], int &n) { cout<<"\nNhap so phan tu:"; cin>>n; randomize(); for(int i=0;i<n;i++) a[i]=random(20); } //Xuất mảng void output(int a[], int n) { for(int i=0;i<n;i++) cout<<a[i]<<","; } //dieu chinh day a[i],a[i+1],...,a[n] thanh heap, biet rang a[i+1],..,a[n] da la heap void adjust(int a[], int i, int n) { int x=a[i]; int j=2*i,done=0; while(j<=n&&!done) { if(j<n&&a[j+1]>a[j]) j=j+1; if(a[j]>x) {a[i]=a[j];i=j;j=2*i;} else done=1; } a[i]=x; } void heapsort(int a[], int n) { for(int i=n/2;i>=1;i--) adjust(a,i,n);

Baitap ktlt code

  • Upload
    ho-loi

  • View
    102

  • Download
    2

Embed Size (px)

Citation preview

Page 1: Baitap ktlt code

Bài 39

+ Câu a:

#include <iostream.h>

#include <stdlib.h>

const max=30;

//Nhập mảng ngẫu nhiên

void input(int a[], int &n)

{ cout<<"\nNhap so phan tu:"; cin>>n; randomize();

for(int i=0;i<n;i++) a[i]=random(20);

}

//Xuất mảng

void output(int a[], int n)

{

for(int i=0;i<n;i++) cout<<a[i]<<",";

}

//dieu chinh day a[i],a[i+1],...,a[n] thanh heap, biet rang a[i+1],..,a[n] da la heap

void adjust(int a[], int i, int n)

{ int x=a[i];

int j=2*i,done=0;

while(j<=n&&!done)

{

if(j<n&&a[j+1]>a[j]) j=j+1;

if(a[j]>x) {a[i]=a[j];i=j;j=2*i;}

else done=1;

}

a[i]=x;

}

void heapsort(int a[], int n)

{

for(int i=n/2;i>=1;i--) adjust(a,i,n);

for(int j=n;j>=2;j--)

{ int x=a[1]; a[1]=a[j]; a[j]=x;

adjust(a,1,j-1);

}

}

Page 2: Baitap ktlt code

void main()

{ int a[max],n;

input(a,n);

cout<<"\nDay truoc khi sx:"; output(a,n);

heapsort(a,n);

cout<<"\nDay sau khi sx:"; output(a,n);

}

+ Câu b:

#include <iostream.h>

#include <stdlib.h>

#include <conio.h>

const max=50;

void input(int a[], int &n)

{ cout<<endl<<"Nhap so phan tu:"; cin>>n;

randomize();

for(int i=1;i<=n;i++) a[i]=random(max);

}

void output(int a[], int n)

{

for(int i=1;i<=n;i++) cout<<a[i]<<" ";

}

int sub_max(int a[], int n, int j)

{ int k=0;

if(j<=n)

{ k=j;

if (j+1<=n&&a[j+1]>a[k]) k=j+1;

if (j+2<=n&&a[j+2]>a[k]) k=j+2;

}

return k;

}

void Adjust(int a[], int i, int n)

{ int x=a[i];

while(1)

{ int k=sub_max(a,n,3*i-1);

if(k==0||a[k]<x) break;

a[i]=a[k]; i=k;

Page 3: Baitap ktlt code

}

a[i]=x;

}

void HeapSort(int a[], int n)

{ for(int i=(n+1)/3; i>=1; i--) Adjust(a,i,n);

for(int j=n;j>=2;j--)

{ int x=a[1]; a[1]=a[j]; a[j]=x;

Adjust(a,1,j-1);

}

}

void main()

{ int a[max],n;

input(a,n);

cout<<endl<<"Day truoc khi sap:"<<endl;

output(a, n);

HeapSort(a,n);

cout<<endl<<"Day sau khi sap:"<<endl;

output(a, n);

}

Bài 2: Cho file văn bản chứa dãy số nguyên, dùng thuật toán merge sort để sắp xếp dãy số trên file.//tron tu nhien ba bang hai giai doan tren file

#include <stdio.h>

#include <stdlib.h>

//tao file chua n so nguyen ngau nhien tu 0 den 19

void WriteFile(char *filename, int n)

{

FILE *f; int i;

f=fopen(filename,"w");

randomize();

for (i=1;i<=n;i++)

fprintf(f,"%d ",random(20));

fclose(f);

}

//doc file chua cac so nguyen hien ra man hinh

void ReadFile(char *filename)

Page 4: Baitap ktlt code

{

FILE *f; int x;

f=fopen(filename,"r");

printf("\n");

while (fscanf(f,"%d",&x)!=EOF)

printf("%d ",x);

fclose(f);

}

//doc mot so tu file f1 ghi vao file f2,

//neu f1 da o cuoi file hoac so tiep theo nho hon so moi doc

//thi doan con trong file f1 da het, gan endsub=1

void CopyRecord(FILE *f1,FILE *f2, int &endsub)

{

int n,m; long p1,p2;

endsub=0;

if (fscanf(f1,"%d",&n)!=EOF)

{

fprintf(f2,"%d ",n);

fgetpos(f1,&p1);

if (fscanf(f1,"%d",&m)==EOF) endsub=1;

else

{

if (m<n) endsub=1;

fsetpos(f1,&p1);

}

}

else endsub=1;

}

//chep mot doan con tu f1 vao f2

void CopySub(FILE *f1,FILE *f2)

{

int endsub=0;

while (!endsub)

CopyRecord(f1,f2,endsub);

}

//tach filename thanh filename1 va filename2

Page 5: Baitap ktlt code

void Split(char *filename, char *filename1, char *filename2)

{

int flag,n,n1; FILE *f,*f1,*f2;

f=fopen(filename,"r");f1=fopen(filename1,"w");f2=fopen(filename2,"w");

flag=1;

while (!feof(f))

{

if (flag) CopySub(f,f1);

else CopySub(f,f2);

flag=1-flag;

}

fclose(f);fclose(f1);fclose(f2);

}

//tra ve so nguyen ma con tro f dang tro toi

//neu con tro o cuoi file thi gan endsub=1

int CurRecord(FILE *f, int &endsub)

{

int n; long p;

endsub=0;

fgetpos(f,&p);

if (fscanf(f,"%d",&n)==EOF) endsub=1;

else fsetpos(f,&p);

return n;

}

//tron filename1 va filename2, ghi vao filename

int Merge(char *filename1, char *filename2, char *filename)

{

FILE *f, *f1, *f2;

int numsub,endsub1,endsub2,n1,n2;

f1=fopen(filename1,"r");f2=fopen(filename2,"r");f=fopen(filename,"w");

numsub=0;

while (!feof(f1)||!feof(f2))

{

endsub1=endsub2=0;

do

{

Page 6: Baitap ktlt code

n1=CurRecord(f1,endsub1);

n2=CurRecord(f2,endsub2);

if (!endsub1&&!endsub2)

{

if (n1<n2) CopyRecord(f1,f,endsub1);

else CopyRecord(f2,f,endsub2);

}

}while(!endsub1 && !endsub2);

if (!endsub1) CopySub(f1,f);

else if (!endsub2) CopySub(f2,f);

numsub++;

}

while (!feof(f1))

{

CopySub(f1,f);

numsub++;

}

while (!feof(f2))

{

CopySub(f2,f);

numsub++;

}

fclose(f);fclose(f1);fclose(f2);

return numsub;

}

void MergeSort(char *filename)

{

char *filename1="d:\\temp1.txt", *filename2="d:\\temp2.txt";

int numsub;

do

{

Split(filename,filename1,filename2);

numsub=Merge(filename1,filename2,filename);

}while(numsub>1);

}

void main()

Page 7: Baitap ktlt code

{

char *filename="d:\\test.txt";

char *filename1="d:\\temp1.txt";

char *filename2="d:\\temp2.txt";

int n;

printf("\nNhap so phan tu cua day so:");

scanf("%d",&n);

WriteFile(filename,n);

ReadFile(filename);

MergeSort(filename);

ReadFile(filename);

}

bai 6 trang 103vd pt 2x1+3x2+3x3=5 (n=3,b=5, a1=2, a2=a3=3)

se co hai nghiem la: x=(1,0,1) va x=(1,1,0)

#include <stdio.h>

#include <conio.h>

int x[100],a[100],n,b,count,s;

void init()

{

printf("n="); scanf("%d",&n);

for (int i=0;i<n;i++)

{

printf("a%d=",i+1); scanf("%d",&a[i]);

}

printf("b="); scanf("%d",&b);

count=0; s=0;

}

void result()

{

count++;

printf("\n%3d) ",count);

for (int i=0;i<n;i++) printf("%2d",x[i]);

}

void Try(int i)

{

for (int j=0; j<=1; j++)

Page 8: Baitap ktlt code

{

if (s<=b) //dk de chap nhan x[i]=j la a[1]*x[1]+...+a[i-1]*x[i-1]<=b

{

x[i]=j; //xac dinh x[i]

s=s+a[i]*x[i]; //cap nhat bien trang thai s

if (i==n-1)

{

if (s==b) result();

}

else Try(i+1);

s=s-a[i]*x[i];//tra lai gia tri cu cua bien trang thai s

}

}

}

void main()

{

clrscr();

init();

Try(0);

getch();

}

bai 7 trang 103vd pt: x1+2x2+3x3=20 (n=3,b=20, a1=1,a2=2,a3=3)

se co 44 nghiem la: x=(0,1,6),.., x=(2,2,4),...,x=(20,0,0)

#include <stdio.h>

#include <conio.h>

int x[100],a[100],n,b,count,s;

void init()

{

printf("n="); scanf("%d",&n);

for (int i=0;i<n;i++)

{

printf("a%d=",i+1);

scanf("%d",&a[i]);

}

printf("b="); scanf("%d",&b);

count=0; s=0;

}

Page 9: Baitap ktlt code

void result()

{

count++;

printf("\n%3d) ",count);

for (int i=0;i<n;i++) printf("%2d",x[i]);

}

void Try(int i)

{

for (int j=0; j<=b/a[i]; j++)//cac gia tri x[i] co the nhan

{

if (s<=b) //dk de chap nhan x[i]=j la a[1]*x[1]+...+a[i-1]*x[i-1]<=b

{

x[i]=j; //xac dinh x[i]

s=s+a[i]*x[i]; //cap nhat bien trang thai s

if (i==n-1)

{

if (s==b) result();

}

else Try(i+1);

s=s-a[i]*x[i];//tra lai gia tri cu cua bien trang thai s

}

}

}

void main()

{

clrscr();

init();

Try(0);

getch();

}

bai 9 trang 104vd: N=5, tach N thanh 1 so, 2 so, 3 so, 4 so, 5 so

5, 1+4, 2+3, 1+1+3, 1+2+2, 1+1+1+2, 1+1+1+1+1

#include <stdio.h>

#include <conio.h>

int x[100],N,count,s,k,n;

void init()

Page 10: Baitap ktlt code

{

printf("N="); scanf("%d",&N);

count=0; s=0; k=1; n=0;

}

void result()

{

count++;

printf("\n%3d) ",count);

for (int i=0;i<n;i++) printf("%2d",x[i]);

}

void Try(int i)

{

for (int j=k; j<=N; j++)//cac kha nang cua x[i]

{

if (s<N)

{

x[i]=j; //xac dinh x[i]

s=s+x[i]; k=j; n++; //cap nhat bien trang thai s,k,n

if (s==N) result();

else if (s<N) Try(i+1);

s=s-x[i]; n--; //tra lai gia tri cu cua bien trang thai s

}

}

}

void main()

{

clrscr();

init();

Try(0);

getch();

}

bai 10 trang 104: hinh vuong than biY tuong: (moi ma phuong la mot hoan vi)

- tim tat ca cac hoan vi cua tap {1,...,n*n}

- Kiem tra hoan vi nao la ma phuong thi in hoan vi do

#include <stdio.h>

#include <conio.h>

Page 11: Baitap ktlt code

int x[100], b[100],n,count;

int a[10][10];

void init()

{

printf("n=");

scanf("%d",&n);

for (int i=0; i<n*n; i++) b[i]=1; //i chua su dung

count=0;

}

int test() //kiem tra hoan vi co la ma phuong

{

int i, j, k, s, s0, s1, s2;

//doi hoan vi thanh ma tran de de kiem tra t/c ma phuong

i=0; j=0;

for (k=0;k<n*n;k++)

{

a[i][j]=x[k]; j++;

if (j==n) {i++; j=0;}

}

//kiem tra tong moi dong phai bang nhau

s0=0;//gia tri dong 0

for (j=0;j<n;j++)

s0=s0+a[0][j];

for (i=1;i<n;i++)

{

s=0;//gia tri dong i

for (j=0;j<n;j++)

s=s+a[i][j];

//neu dong i khac dong 0 thi khong phai ma phuong

if (s!=s0) return 0;

}

//kiem tra cot

s0=0;//gia tri cot 0

for (i=0;i<n;i++)

s0=s0+a[i][0];

for (j=1;j<n;j++)

Page 12: Baitap ktlt code

{

s=0;//gia tri cot j

for (i=0;i<n;i++)

s=s+a[i][j];

//neu cot j khac cot 0 thi khong phai ma phuong

if (s!=s0) return 0;

}

//kiem tra duong cheo

s1=0,s2=0;

for (i=0;i<n;i++)

{

s1=s1+a[i][i];

s2=s2+a[i][n-1-i];

}

if (s1!=s2) return 0;

return 1; //hoan vi la ma phuong

}

void result()

{

if (test())

{

count++;

printf("\nMa phuong %d:\n",count);

for (int i=0;i<n;i++)

{

for (int j=0;j<n;j++)

printf("%3d",a[i][j]);

printf("\n");

}

}

}

void Try(int i)

{

for (int j=0; j<n*n; j++)

{

Page 13: Baitap ktlt code

if (b[j])

{

x[i]=j+1; b[j]=0;//j su dung roi

if (i==n*n-1) result();

else Try(i+1);

b[j]=1; //tra lai trang thai cu, j chua su dung

}

}

}

void main()

{

clrscr();

init();

Try(0);

getch();

}

Giải:

Bài 2:

Hướng dẫn:

a) Duyệt từ đầu đến cuối văn bản chương trình và sử dụng các phép biến đổi tương đương sau:

+ Nếu gặp lệnh while thì giữ nguyên.

+ Nếu gặp lệnh do..while chuyển sang while như sau:

do

{

khoi_lenh; //gồm một hoặc nhiều lệnh

}while(bieu_thuc_đieu_kien);

khoi_lenh;

while(bieu_thuc_đieu_kien)

{

khoi_lenh;

}

+ Nếu gặp lệnh for chuyển sang while như sau:

for(bieu_thuc_1;bieu_thuc_dieu_kien; bieu_thuc_2)

{

khoi_lenh;

}

bieu_thuc_1;

while(bieu_thuc_dieu_kien)

{

khoi_lenh;

bieu_thuc_2;

}

+ Nếu gặp lệnh if chuyển sang while như sau:

Page 14: Baitap ktlt code

if (bieu_thuc_dieu_kien)

{

khoi_lenh;

}

while(bieu_thuc_dieu_kien )

{

khoi_lenh; break;

}

+ Nếu gặp lệnh if..else chuyển sang while như sau:

if (bieu_thuc_dieu_kien)

khoi_lenh_1;

else

khoi_lenh_2;

int flag=1;

while(bieu_thuc_dieu_kien )

{ khoi_lenh_1; flag=0; break;

}

while(flag)

{ khoi_lenh_2; break;

}

+ Nếu gặp lệnh switch() chuyển sang lệnh if else, sau đó từ if else chuyển sang while:

switch(bieu_thuc)

{

case gia_tri_1: khoi_lenh_1; break;

case gia_tri_2: khoi_lenh_2; break;

[. . . ]

case gia_tri_n: khoi_lenh_n; break;

[default: khoi_lenh_n+1; ]

}

if (bieu_thuc==gia_tri_1) khoi_lenh_1;

else

if (bieu_thuc==gia_tri_2) khoi_lenh_2;

else

[…]

if (bieu_thuc==gia_tri_n) khoi_lenh_n;

[else khoi_lenh_n+1;]

Bài 3:

Hướng dẫnCách 1:

#include <stdio.h>

#include <conio.h>

#define MAX 100//so vat toi da

int n;//so vat thuc su

int B;//suc chua cai tui

int A[MAX];//mang chua trong luong cua cac vat: a1,...,an

Page 15: Baitap ktlt code

int C[MAX];//mang chua gia tri cua cac vat: c1,...,cn

//mot phuong an la mot day nhi phan x1,...,xn (xi=0/1)

int X[MAX];//mang chua phuong an hien tai

//phuong an toi uu la phuong an cho gia tri lon nhat

int XOPT[MAX];//mang chua phuong an toi uu: xopt[i]=0/1

//gia tri toi uu la gia tri su dung ung voi phuong an toi uu

int FOPT;//mang chua gia tri toi uu

int stop=0;//stop=1 la ngung sinh day nhi phan ke tiep

char *filename="d:\\data.in";

void DocFile()

{

FILE *fp = fopen(filename,"r");//mo file du lieu de doc

fscanf(fp, "%d%d", &n,&B);//doc so vat n va suc chua cai tui B

printf("\n So vat:%d",n);

printf("\n suc chua cai tui:%d",B);

printf("\n gia tri cua moi vat:");

for(int i=1; i<=n; i++) //doc gia tri cua moi vat c1,...,cn

{

fscanf(fp,"%d",&C[i]);

printf("%4d",C[i]);

}

printf("\n trong luong cua moi vat:");

for(i=1; i<=n; i++)//doc trong luong moi vat: a1,...,an

{

fscanf(fp,"%d",&A[i]);

printf("%4d",A[i]);

}

fclose(fp);

}

void KhoiTao()

{

FOPT = -32000; //gan gia tri toi uu ban dau

//gan phuong an hien tai ban dau: x1=x2=...=xn=0

//va phuong an toi uu ban dau: xopt[1]=xopt[2]=...=xopt[n]=0

for(int i=1; i<=n; i++)

{

Page 16: Baitap ktlt code

X[i]=0;

XOPT[i]=0;

}

}

void DayNhiPhanKe()//tim day nhi phan ke tiep

{

int i=n;

while(i>0 && X[i]==1) {X[i]=0;i--;}

if( i==0) stop=1;

else X[i]=1;

}

void CapNhatPATU()//cap nhat phuong an toi uu

{ //X1,...,Xn la day nhi phan ung voi phuong an hien tai

//S la tong trong luong cac vat ung voi phuong an hien tai

//P la tong gia tri cac vat ung voi phuong an hien tai

int S=0, P=0;

for( int i=1; i<=n ; i++)//tinh S va P

{

S = S + A[i] * X[i];

P = P + C[i] * X[i];

}

//Neu phuong an hien tai co tong trong luong cac vat<= suc chua cai tui

//va tong gia tri cac vat > phuong an toi uu tam thoi thi cap nhat

if ( S<=B && FOPT < P)

{

FOPT = P; // Cap nhat gia tri toi uu moi

for(i=1; i<=n; i++) // Cap nhat phuong an toi uu moi

XOPT[i] = X[i];

}

}

void GhiFile()

{ // Dua ra ket qua toi uu

FILE* fp = fopen("ketqua.out","w");//mo file ketqua de ghi

fprintf(fp,"%d\n",FOPT);//ghi gia tri toi uu vao file

printf("\n Gia tri toi uu :%d", FOPT);

printf("\n Phuong an toi uu:");

Page 17: Baitap ktlt code

for(int i=1; i<=n; i++)//ghi phuong an toi uu vao file

{

printf("%3d",XOPT[i]);

fprintf(fp,"%3d",XOPT[i]);

}

fclose(fp);

}

void main()

{

DocFile(); KhoiTao();

while(stop==0)//lan luot xet tat ca cac day nhi phan ung voi moi phuong an

{

CapNhatPATU();

DayNhiPhanKe();

}

GhiFile();

}

Cách 2:

#include <stdio.h>

#include <conio.h>

#define MAX 100//so vat toi da

int n;//so vat thuc su

int B;//suc chua cai tui

int A[MAX];//mang chua trong luong cua cac vat: a1,...,an

int C[MAX];//mang chua gia tri cua cac vat: c1,...,cn

//mot phuong an la mot day nhi phan x1,...,xn (xi=0/1)

int X[MAX];//mang chua phuong an hien tai

//phuong an toi uu la phuong an cho gia tri lon nhat

int XOPT[MAX];//mang chua phuong an toi uu: xopt[i]=0/1

//gia tri toi uu la gia tri su dung ung voi phuong an toi uu

int FOPT;//mang chua gia tri toi uu

char *filename="d:\\data.in";

void DocFile()

{ FILE *fp = fopen(filename,"r");//mo file du lieu de doc

fscanf(fp, "%d%d", &n,&B);//doc so vat n va suc chua cai tui B

Page 18: Baitap ktlt code

printf("\n So vat:%d",n);

printf("\n suc chua cai tui:%d",B);

printf("\n gia tri cua moi vat:");

for(int i=1; i<=n; i++) //doc gia tri cua moi vat c1,...,cn

{

fscanf(fp,"%d",&C[i]);

printf("%4d",C[i]);

}

printf("\n trong luong cua moi vat:");

for(i=1; i<=n; i++)//doc trong luong moi vat: a1,...,an

{

fscanf(fp,"%d",&A[i]);

printf("%4d",A[i]);

}

fclose(fp);

FOPT = -32000; //gan gia tri toi uu ban dau

}

void CapNhatPATU()//cap nhat phuong an toi uu

{ //X1,...,Xn la day nhi phan ung voi phuong an hien tai

//S la tong trong luong cac vat ung voi phuong an hien tai

//P la tong gia tri cac vat ung voi phuong an hien tai

int S=0, P=0;

for( int i=1; i<=n ; i++)//tinh S va P

{

S = S + A[i] * X[i];

P = P + C[i] * X[i];

}

//Neu phuong an hien tai co tong trong luong cac vat<= suc chua cai tui

//va tong gia tri cac vat > phuong an toi uu tam thoi thi cap nhat

if ( S<=B && FOPT < P)

{ FOPT = P; // Cap nhat gia tri toi uu moi

for(i=1; i<=n; i++) // Cap nhat phuong an toi uu moi

XOPT[i] = X[i];

}

}

void Try(int i)//lan luot xet tat ca cac phuong an

Page 19: Baitap ktlt code

{

for(int j=0;j<=1;j++)

{

X[i]=j;

if(i==n) CapNhatPATU();

else Try(i+1);

}

}

void GhiFile()

{ // Dua ra ket qua toi uu

FILE* fp = fopen("ketqua.out","w");//mo file ketqua de ghi

fprintf(fp,"%d\n",FOPT);//ghi gia tri toi uu vao file

printf("\n Gia tri toi uu :%d", FOPT);

printf("\n Phuong an toi uu:");

for(int i=1; i<=n; i++)//ghi phuong an toi uu vao file

{

printf("%3d",XOPT[i]);

fprintf(fp,"%3d",XOPT[i]);

}

fclose(fp);

}

void main()

{

DocFile();

Try(1);

GhiFile();

}

* Cach 3:

#include <stdio.h>

#include <conio.h>

#define MAX 100//so vat toi da

int n;//so vat thuc su

int B;//suc chua cai tui

int A[MAX];//mang chua trong luong cua cac vat: a1,...,an

int C[MAX];//mang chua gia tri cua cac vat: c1,...,cn

Page 20: Baitap ktlt code

//mot phuong an la mot day nhi phan x1,...,xn (xi=0/1)

int X[MAX];//mang chua phuong an hien tai

//phuong an toi uu la phuong an cho gia tri lon nhat

int XOPT[MAX];//mang chua phuong an toi uu: xopt[i]=0/1

//gia tri toi uu la gia tri su dung ung voi phuong an toi uu

int FOPT;//mang chua gia tri toi uu

char *filename="d:\\data.in";

int S=0,P=0;

void DocFile()

{ FILE *fp = fopen(filename,"r");//mo file du lieu de doc

fscanf(fp, "%d%d", &n,&B);//doc so vat n va suc chua cai tui B

printf("\n So vat:%d",n);

printf("\n suc chua cai tui:%d",B);

printf("\n gia tri cua moi vat:");

for(int i=1; i<=n; i++) //doc gia tri cua moi vat c1,...,cn

{

fscanf(fp,"%d",&C[i]);

printf("%4d",C[i]);

}

printf("\n trong luong cua moi vat:");

for(i=1; i<=n; i++)//doc trong luong moi vat: a1,...,an

{

fscanf(fp,"%d",&A[i]);

printf("%4d",A[i]);

}

fclose(fp);

FOPT = -32000; //gan gia tri toi uu ban dau

}

void Try(int i)//lan luot xet tat ca cac phuong an

{

for(int j=0;j<=1;j++)

{

X[i]=j;S=S+A[i]*X[i];P=P+C[i]*X[i];

if(i==n)

{

if ( S<=B && FOPT < P)

Page 21: Baitap ktlt code

{ FOPT = P; //Cap nhat gia tri toi uu moi

for(int k=1; k<=n; k++) // Cap nhat phuong an toi uu moi

XOPT[k] = X[k];

}

}

else

if(S<B) Try(i+1);

S=S-A[i]*X[i];P=P-C[i]*X[i];

}

}

void GhiFile()

{ // Dua ra ket qua toi uu

FILE* fp = fopen("ketqua.out","w");//mo file ketqua de ghi

fprintf(fp,"%d\n",FOPT);//ghi gia tri toi uu vao file

printf("\n Gia tri toi uu :%d", FOPT);

printf("\n Phuong an toi uu:");

for(int i=1; i<=n; i++)//ghi phuong an toi uu vao file

{ printf("%3d",XOPT[i]);

fprintf(fp,"%3d",XOPT[i]);

}

fclose(fp);

}

void main()

{

DocFile();

Try(1);

GhiFile();

}

Bai 24:

HD:

#include <conio.h>

#include <string.h>

char *data1="d:\\data1.out";

char *data2="d:\\data2.out";

int num1=0,num2=0;

void Sdt(int flag)//flag=0 la dem, flag=1 la ghi

Page 22: Baitap ktlt code

{

FILE *f1=fopen(data1,"w");

FILE *f2=fopen(data2,"w");

if(flag==1) {fprintf(f1,"%d",num1);fprintf(f2,"%d",num2);}

for(int n=1;n<=4;n++)

for(int x1=0;x1<=9;x1++)

for(int x2=0;x2<=9;x2++)

for(int x3=0;x3<=9;x3++)

{

if(flag==0) num1++;

else

fprintf(f1,"\n091%d.%d%d%d.%d%d%d",n,x1,x2,x3,x3,x2,x1);

if(x1+x2+x3==4)

{ if (flag==0) num2++;

else

fprintf(f2,"\n091%d.%d%d%d.%d%d%d",n,x1,x2,x3,x3,x2,x1);

}

}

fclose(f1);fclose(f2);

}

void main()

{ Sdt(0);//dem cac so dien thoai

Sdt(1);//ghi cac so dien thoai vao file

}

Bài 25:

Chú ý: làm bài tập tương tự với đồ thị có hướng

HD:

#include <stdio.h>

const max=30;//so dinh toi da

int n;//so dinh thuc su

int mtk[max][max];//mang chua ma tran ke

int stplt=0;//bien dem so thanh phan lien thong

Page 23: Baitap ktlt code

//mang danh dau dinh da tham roi hay chua

//tham[i]=0 la i chua tham

//tham[i]=k la i tham roi, va i thuoc thanh phan lien thong thu k

int tham[max];

char *dothi="d:\\dothi.in";

char *ketqua="d:\\ketqua.out";

void DocFile()

{ int i,j;

FILE *f=fopen(dothi,"r");//mo file dothi de doc

fscanf(f,"%d",&n);//doc so dinh cua do thi

//ban dau gan mtk=0

for(i=1;i<=n;i++)

for(j=1;j<=n;j++) mtk[i][j]=0;

//lan luot doc cac canh (i,j) trong file

while(fscanf(f,"%d%d",&i,&j)!=EOF)

mtk[i][j]=mtk[j][i]=1; //gan 1 vao vi tri tuong ung trong mtk

fclose(f);//dong file

}

void DFS1(int i)//duyet mot thanh phan lien thong chua dinh i

{

tham[i]=stplt;//danh dau i tham roi va i thuoc tplt thu stplt

for(int j=1;j<=n;j++)

if(tham[j]==0&&mtk[i][j]==1)//neu j chua tham va j ke i

DFS1(j);//tham j

}

void DFS()

{

//ban dau gan tat ca cac dinh la chua tham

for(int i=1;i<=n;i++) tham[i]=0;

for(i=1;i<=n;i++)//lan luot xet cac dinh i

if(tham[i]==0)//neu dinh i chua tham

{ stplt++;//tang so tplt

DFS1(i);//tham mot tplt chua i

}

}

void GhiFile()

Page 24: Baitap ktlt code

{

FILE *f=fopen(ketqua,"w");//mo file ket qua de ghi

if(stplt==1) fprintf(f,"Do thi lien thong");

else

{

fprintf(f,"Do thi khong lien thong");

for(int i=1;i<=stplt;i++)

{

fprintf(f,"\nThanh phan lien thong thu %d:",i);

for(int j=1;j<=n;j++)

if(tham[j]==i)//neu j thuoc tplt thu i

fprintf(f,"%4d",j);//ghi j vao tplt thu i

}

}

fclose(f);

}

void main()

{

DocFile();

DFS();

GhiFile();

}

Bài 26

* Bài 1:

+ Câu a:

#include <iostream.h>

#include <stdlib.h>

const max=30;

void input(int a[], int &n)

{ cout<<"\nNhap so phan tu:"; cin>>n; randomize();

for(int i=1;i<=n;i++) a[i]=random(20);

}

void output(int a[], int n)

{

for(int i=1;i<=n;i++) cout<<a[i]<<",";

Page 25: Baitap ktlt code

}

//dieu chinh day a[i],a[i+1],...,a[n] thanh heap, biet rang a[i+1],..,a[n] da la heap

void adjust(int a[], int i, int n)

{ int x=a[i]; //cat a[i] vao bien x (bien tam)

int j=2*i; //a[j] la con cua a[i]

while(j<=n)

{ //neu a[i] co hai con thi chon a[j] la con lon nhat

if (j<n && a[j+1]>a[j]) j=j+1;

if (a[j]>x) //neu con cua a[i] la a[j] lon hon x

{

a[i]=a[j];//doi a[j] len vt a[i]

i=j;//lai xet pt a[i] moi

j=2*i;//a[j] la con cua a[i]

}

else break;//neu a[j]<=x thi ngung

}

a[i]=x;

}

void heapsort(int a[], int n)

{

/*

lan luot dieu chinh cac day

a[n/2],…,a[n]; a[n/2 + 1],…,a[n]; a[1],…,a[n]

thanh heap

*/

for(int i=n/2;i>=1;i--)

{ adjust(a,i,n);

cout<<"\ni="<<i<<": ";output(a,n);

}

//lan luot dua pt lon nhat xuong vt a[n],…,a[2] bang cach hoan vi voi a[1]

//sau do giam n va lai dieu chinh a[1] den a[n] thanh heap

for(int j=n;j>=2;j--)

{ int x=a[1]; a[1]=a[j]; a[j]=x; //hoan vi a[j] voi a[1]

adjust(a,1,j-1);//dieu chinh day a[1],…,a[j-1] thanh heap

cout<<"\nj="<<j<<": ";output(a,n);

}

Page 26: Baitap ktlt code

}

void main()

{ int a[max],n;

input(a,n);

cout<<"\nDay truoc khi sx:"; output(a,n);

heapsort(a,n);

cout<<"\nDay sau khi sx:"; output(a,n);

}

+ Câu b:

#include <iostream.h>

#include <stdlib.h>

#include <conio.h>

const max=50;

void input(int a[], int &n)

{ cout<<endl<<"Nhap so phan tu:"; cin>>n;

randomize();

for(int i=1;i<=n;i++) a[i]=random(max);

}

void output(int a[], int n)

{

for(int i=1;i<=n;i++) cout<<a[i]<<" ";

}

int sub_max(int a[], int n, int j)

{ int k=0;

if(j<=n)

{ k=j;

if (j+1<=n&&a[j+1]>a[k]) k=j+1;

if (j+2<=n&&a[j+2]>a[k]) k=j+2;

}

return k;

}

void Adjust(int a[], int i, int n)

{ int x=a[i];

while(1)

{ int k=sub_max(a,n,3*i-1);

if(k==0||a[k]<x) break;

Page 27: Baitap ktlt code

a[i]=a[k]; i=k;

}

a[i]=x;

}

void HeapSort(int a[], int n)

{ for(int i=(n+1)/3; i>=1; i--) Adjust(a,i,n);

for(int j=n;j>=2;j--)

{ int x=a[1]; a[1]=a[j]; a[j]=x;

Adjust(a,1,j-1);

}

}

void main()

{ int a[max],n;

input(a,n);

cout<<endl<<"Day truoc khi sap:"<<endl;

output(a, n);

HeapSort(a,n);

cout<<endl<<"Day sau khi sap:"<<endl;

output(a, n);

}

Bài 27:

* Bài 2:

include <iostream.h>

#include <stdlib.h>

//#include <conio.h>

const max=50;

struct datatype

{ int l,r;

};

struct node

{ datatype data;

node * next;

};

typedef node* nodeptr;

void push(nodeptr &s, datatype x)

{ nodeptr p=new node;

Page 28: Baitap ktlt code

p->data=x;p->next=s;s=p;

}

datatype pop(nodeptr &s)

{ if(s==NULL) {cout<<"\nStack is empty!"; exit(1);}

nodeptr p=s; datatype x=p->data;

s=s->next; delete p;return x;

}

void input(int a[], int &n)

{ cout<<endl<<"Nhap so phan tu:"; cin>>n;

randomize();

for(int i=1;i<=n;i++) a[i]=random(max);

}

void output(int a[], int n)

{

for(int i=1;i<=n;i++) cout<<a[i]<<" ";

}

void quick_sort(int a[], int l, int r)

{ nodeptr s=NULL; datatype x,y;

x.l=l; x.r=r; push(s,x);

while(s!=NULL)

{ datatype x=pop(s);

int t=a[(x.l+x.r)/2],i=x.l,j=x.r;

do

{ while(a[i]<t) i++;

while(a[j]>t) j--;

if(i<=j)

{ int temp=a[i];a[i]=a[j]; a[j]=temp;

i++; j--;

}

}while(i<=j);

if (x.l<j){y.l=x.l;y.r=j;push(s,y);}

if (i<x.r){y.l=i;y.r=x.r; push(s,y);}

}

}

void main()

Page 29: Baitap ktlt code

{ int a[max],n,m;char ans;

do

{ input(a,n);

cout<<endl<<"Day so truoc khi sap:"<<endl;

output(a, n);quick_sort(a,1,n);

cout<<endl<<"Day so sau khi sap:"<<endl;

output(a, n);

cout<<"\nTiep khong (c/k)?:"; cin>>ans;

}while(ans=='c'||ans=='C');

}

Bài 28

* Bài 3:

//tron tu nhien ba bang hai giai doan tren file

#include <stdio.h>

#include <stdlib.h>

//tao file chua n so nguyen ngau nhien tu 0 den 19

void WriteFile(char *filename, int n)

{

FILE *f; int i;

f=fopen(filename,"w");

randomize();

for (i=1;i<=n;i++)

fprintf(f,"%d ",random(20));

fclose(f);

}

//doc file chua cac so nguyen hien ra man hinh

void ReadFile(char *filename)

{

FILE *f; int x;

f=fopen(filename,"r");

printf("\n");

while (fscanf(f,"%d",&x)!=EOF)

printf("%d ",x);

fclose(f);

}

//doc mot so tu file f1 ghi vao file f2,

Page 30: Baitap ktlt code

//neu f1 da o cuoi file hoac so tiep theo nho hon so moi doc

//thi doan con trong file f1 da het, gan endsub=1

void CopyRecord(FILE *f1,FILE *f2, int &endsub)

{

int n,m; long p1,p2;

endsub=0;

if (fscanf(f1,"%d",&n)!=EOF)

{

fprintf(f2,"%d ",n);

fgetpos(f1,&p1);

if (fscanf(f1,"%d",&m)==EOF) endsub=1;

else

{

if (m<n) endsub=1;

fsetpos(f1,&p1);

}

}

else endsub=1;

}

//chep mot doan con tu f1 vao f2

void CopySub(FILE *f1,FILE *f2)

{

int endsub=0;

while (!endsub)

CopyRecord(f1,f2,endsub);

}

//tach filename thanh filename1 va filename2

void Split(char *filename, char *filename1, char *filename2)

{

int flag,n,n1; FILE *f,*f1,*f2;

f=fopen(filename,"r");f1=fopen(filename1,"w");f2=fopen(filename2,"w");

flag=1;

while (!feof(f))

{

if (flag) CopySub(f,f1);

else CopySub(f,f2);

Page 31: Baitap ktlt code

flag=1-flag;

}

fclose(f);fclose(f1);fclose(f2);

}

//tra ve so nguyen ma con tro f dang tro toi

//neu con tro o cuoi file thi gan endsub=1

int CurRecord(FILE *f, int &endsub)

{

int n; long p;

endsub=0;

fgetpos(f,&p);

if (fscanf(f,"%d",&n)==EOF) endsub=1;

else fsetpos(f,&p);

return n;

}

//tron filename1 va filename2, ghi vao filename

int Merge(char *filename1, char *filename2, char *filename)

{

FILE *f, *f1, *f2;

int numsub,endsub1,endsub2,n1,n2;

f1=fopen(filename1,"r");f2=fopen(filename2,"r");f=fopen(filename,"w");

numsub=0;

while (!feof(f1)||!feof(f2))

{

endsub1=endsub2=0;

do

{

n1=CurRecord(f1,endsub1);

n2=CurRecord(f2,endsub2);

if (!endsub1&&!endsub2)

{

if (n1<n2) CopyRecord(f1,f,endsub1);

else CopyRecord(f2,f,endsub2);

}

}while(!endsub1 && !endsub2);

if (!endsub1) CopySub(f1,f);

Page 32: Baitap ktlt code

else if (!endsub2) CopySub(f2,f);

numsub++;

}

while (!feof(f1))

{

CopySub(f1,f);

numsub++;

}

while (!feof(f2))

{

CopySub(f2,f);

numsub++;

}

fclose(f);fclose(f1);fclose(f2);

return numsub;

}

void MergeSort(char *filename)

{

char *filename1="d:\\temp1.txt", *filename2="d:\\temp2.txt";

int numsub;

do

{

Split(filename,filename1,filename2);

numsub=Merge(filename1,filename2,filename);

}while(numsub>1);

}

void main()

{

char *filename="d:\\test.txt";

char *filename1="d:\\temp1.txt";

char *filename2="d:\\temp2.txt";

int n;

printf("\nNhap so phan tu cua day so:");

scanf("%d",&n);

WriteFile(filename,n);

ReadFile(filename);

Page 33: Baitap ktlt code

MergeSort(filename);

ReadFile(filename);

}

Bài 29:

* Bài 4

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <string.h>

struct sinhvien

{

char masv[10];

int diemthi;

};

int Eof(FILE *f)

{

fpos_t fpos; sinhvien sv;

int num;//so sv doc duoc phai la 1, neu la 0 thi het file

fpos=ftell(f);

num=fread(&sv,sizeof(sv),1,f);

fseek(f,fpos,0);

return (num==0)?1:0;

}

void RandomFileSV(char *filename, int n)

{

FILE *f=fopen(filename,"wb");

sinhvien sv; char index[5];

randomize();

for(int i=1;i<=n;i++)

{

itoa(i,index,10);

strcpy(sv.masv,"DH08");

if (i<10) strcat(sv.masv,"0");

strcat(sv.masv,index);

sv.diemthi= random(11);

fwrite(&sv,sizeof(sv),1,f);

Page 34: Baitap ktlt code

}

fclose(f);

}

void PrintFileSV(char *filename)

{

FILE *f=fopen(filename,"rb");

sinhvien sv;

//neu het file fread tra ve 0

while(!Eof(f))

{

fread(&sv,sizeof(sv),1,f);

printf("\n%-10s%4d",sv.masv,sv.diemthi);

}

fclose(f);

}

int CurrentRecord(FILE* f)

{

fpos_t fpos; sinhvien sv;

fpos=ftell(f);

fread(&sv,sizeof(sv),1,f);

fseek(f,fpos,0);

return sv.diemthi;//tra ve diem thi cua sv hien hanh

}

int CopyRecord(FILE* f1, FILE* f2)

{

int n; sinhvien sv;

if (!Eof(f1))

{

fread(&sv,sizeof(sv),1,f1);

fwrite(&sv,sizeof(sv),1,f2);

}

if (Eof(f1)) return 1;

else return (CurrentRecord(f1)<sv.diemthi)?1:0;

//1 la kt doan con hoac het file

}

void CopySubFile(FILE *f1, FILE *f2)

Page 35: Baitap ktlt code

{

while(!CopyRecord(f1,f2));

}

void SplitFile(char *filename,char *filename1, char *filename2)

{

FILE *f,*f1,*f2; int filenum;

f=fopen(filename,"rb");f1=fopen(filename1,"wb");

f2=fopen(filename2,"wb");

filenum=1;

while(!Eof(f))

{

if (filenum==1) CopySubFile(f,f1);

else CopySubFile(f,f2);

filenum=3-filenum;

}

fclose(f);fclose(f1);fclose(f2);

}

int MergeFile(char *filename1,char *filename2,char *filename)

{

FILE *f,*f1,*f2;

int numsubfile,endsubfile1,endsubfile2;

numsubfile=0;

f1=fopen(filename1,"rb");f2=fopen(filename2,"rb");

f=fopen(filename,"wb");

while(!Eof(f1)&&!Eof(f2))

{

endsubfile1=endsubfile2=0;

do

{

if (CurrentRecord(f1)<CurrentRecord(f2))

endsubfile1=CopyRecord(f1,f);

else

endsubfile2=CopyRecord(f2,f);

}while(!endsubfile1&&!endsubfile2);

if (!endsubfile1) CopySubFile(f1,f);

else

Page 36: Baitap ktlt code

if (!endsubfile2) CopySubFile(f2,f);

numsubfile++;

}

while(!Eof(f1))

{

CopySubFile(f1,f);

numsubfile++;

}

while(!Eof(f2))

{

CopySubFile(f2,f);

numsubfile++;

}

fclose(f);fclose(f1);fclose(f2);

return numsubfile;

}

void MergeSort(char *file)

{

char *file1="d:\\test1.dat";

char *file2="d:\\test2.dat";

int numsubfile=0;

do

{

SplitFile(file,file1,file2);

numsubfile=MergeFile(file1,file2,file);

}while(numsubfile>1);

remove(file1);remove(file2);

}

void main()

{

char *filename="d:\\test.dat";

clrscr();

RandomFileSV(filename,10);

printf("\nFile sv truoc khi sap xep:");

PrintFileSV(filename);

Page 37: Baitap ktlt code

MergeSort(filename);

printf("\nFile sv sau khi sap xep:");

PrintFileSV(filename);

getch();

}

BÀI TẬP 77: Cài đặt thuật toán Ford-Fulkerson#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

const max=20;

int dsc[max][4],c[max][max],f[max][max];

int p[max],d[max],tham[max],m,n,s,t;

char *tenfile="d:/fordfulk.txt";

//doc d/s cung tu file, m la so cung, n la so dinh

void Doc_File_DSC()

{

FILE *f=fopen(tenfile,"r");

if (f==NULL)

{

printf("\nFile %s khong co",tenfile); exit(0);

}

fscanf(f,"%d%d%d%d",&n,&m,&s,&t);

for (int i=1; i<=m; i++)

{

fscanf(f,"%d%d%d%d",&(dsc[i][0]),&(dsc[i][1]),&(dsc[i][2]),&(dsc[i][3]));

}

fclose(f);

}

const vc=100; //vo cuc

//Chuyen danh sach cung sang ma tran ke co huong

void Chuyen_DSC_MTK()

{

int i,j,k;

for (i=1; i<=n; i++)

for (j=1; j<=n; j++)

{ c[i][j]=f[i][j]=0;}

Page 38: Baitap ktlt code

for (k=1; k<=m; k++)

{

i=dsc[k][0],j=dsc[k][1]; c[i][j]=dsc[k][2];f[i][j]=dsc[k][3];

}

}

//tim duong tang luong

int Find_Path()

{

int u,v,queue[max],dau,cuoi;

for (v=1;v<=n;v++) tham[v]=0;

queue[1]=s;p[s]=s;d[s]=vc;tham[s]=1;

dau=1; cuoi=2;

while (dau!=cuoi)

{

u=queue[dau++];

for (v=1;v<=n;v++)

{

if (!tham[v])

{

if (c[u][v]>0 && f[u][v]<c[u][v]) // Gf co cung thuan (u,v)

{

p[v]=u; d[v]=(d[u]<c[u][v]-f[u][v])?d[u]:(c[u][v]-f[u][v]);

if (v == t) return 1;

queue[cuoi++]=v; tham[v]=1;

}

if (c[v][u]>0 && f[v][u]>0) //co cung nghich (u,v)

{

p[v]=-u; d[v]=(d[u]<f[v][u])?d[u]:f[v][u];

if (v == t) return 1;

queue[cuoi++]=v; tham[v]=1;

}

}

}

}

return 0;

Page 39: Baitap ktlt code

}

//tang luong

void Inc_Flow()

{

int u,v,tang;

v=p[t]; u=t; tang=d[t];

while (u!=s)

{

if (v>0) f[v][u]=f[v][u]+tang;

else

{

v=-v; f[u][v]=f[u][v]-tang;

}

u=v; v= p[u];

}

}

void Max_Flow()

{

int u,v,stop,sum;

stop=0;

while (!stop)

if (Find_Path()) Inc_Flow(); else stop=1;

printf("Luong cuc dai:");

for (u=1;u<=n;u++)

{

printf("\n");

for (v=1;v<=n;v++)

{

printf("%d ",f[u][v]);

}

}

sum=0;

for (u=1;u<=n;u++)

if (c[s][u]>0) sum+=f[s][u];

printf("\n\nGia tri luong cuc dai:%d",sum);

printf("\n\nLat cat:");

Page 40: Baitap ktlt code

printf("\nVT:");

for (u=1;u<=n;u++)

if (tham[u]) printf("%d ",u);

printf("\nV\\VT:");

for (u=1;u<=n;u++)

if (!tham[u]) printf("%d ",u);

}

void main()

{

clrscr();

Doc_File_DSC();

Chuyen_DSC_MTK();

Max_Flow();

getch();

}

Bài 30

HD:

//tim cay khung nho nhat tren do thi lien thong

#include <stdio.h>

#include <conio.h>

const max=30;//so dinh toi da

const vc=1000;//gia tri vo cuc

int n;//so dinh thuc su

int s;//dinh xuat phat

int mtk[max][max];//mang chua ma tran ke

int tham[max];//tham[i]=0 la i chua tham,tham[i]=1 la i tham roi

int d[max];//d[i] kcnn tu i den cay khung

int gan[max];//gan[i]=j nghia la j la dinh cua cay khung gan i nhat

int canhck[max][3];//mang luu canh cay khung

int m=0;//so canh cay khung

int cd=0;//chieu dai cay khung

char *dulieu="d:\\caykhung.in";

char *ketqua="d:\\caykhung.out";

void DocFile()

Page 41: Baitap ktlt code

{ int i,j,k;

FILE *f=fopen(dulieu,"r");//mo file du lieu de doc

fscanf(f,"%d%d",&n,&s);//doc so dinh n va dinh xuat phat s

//gan tri ban dau cho mtk

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)

if(i==j) mtk[i][j]=0; else mtk[i][j]=vc;

//lan luot doc tu file cac canh(i,j) co trong so k

while(fscanf(f,"%d%d%d",&i,&j,&k)!=EOF)

mtk[i][j]=mtk[j][i]=k;//gan k vao vi tri tuong ung trong mtk

fclose(f);//dong file

}

void Prim()//tim cay khung nn voi s la dinh xuat phat

{ int i,j,u,v,min;

for(i=1;i<=n;i++)

{

d[i]=mtk[s][i];gan[i]=s;tham[i]=0;

}

tham[s]=1;//danh dau s tham roi

for(i=1;i<=n-1;i++)//lan luot tham n-1 dinh con lai

{

//tim dinh u chua tham va co d[u] nho nhat de tham

min=vc;

for(j=1;j<=n;j++)

if(tham[j]==0&&d[j]<min)//neu j chua tham va d[j]<min

{ u=j;

min=d[j];

}

tham[u]=1;++m;

canhck[m][1]=u;canhck[m][2]=gan[u];canhck[m][3]=mtk[u][gan[u]];

cd=cd+canhck[m][3];

//cap nhat cac dinh v chua tham va v ke u

for(v=1;v<=n;v++)

if(tham[v]==0&&mtk[u][v]!=vc)

if(d[v]>mtk[u][v])

{

Page 42: Baitap ktlt code

d[v]=mtk[u][v];gan[v]=u;

}

}

}

void GhiFile()

{

FILE *f=fopen(ketqua,"w");

int i,j,k;

fprintf(f,"%d\t%d",m,cd);

for(i=1;i<=m;i++)

fprintf(f,"\n%d\t%d\t%d",canhck[i][1],canhck[i][2],canhck[i][3]);

fclose(f);

}

void main()

{

DocFile();

Prim();

GhiFile();

}

Bài 31

Bài giải 31:

HD:

#include <stdio.h>

#include <math.h>

#include <conio.h>

const max=30;

int a=3,b=6;

int X[max];//chua so can tim: x1x2...xn (a<=n<=b)

int S,P,B;

int count=0;

long K=0;

void tinhK(int i)//tinh K co i chu so X1X2...Xi

{ long q=1;K=0;

for(int j=i;j>0;j--)

{

K=K+q*X[j];q=q*10;

Page 43: Baitap ktlt code

}

}

int ktnt()//kiem tra K co la nguyen to kg?

{ int nt=1;

for(long i=2;i<=sqrt(K);i++)

if(K%i==0) {nt=0;break;}

return nt;

}

//kiem tra xem K=x1...xi co tong x1+...+xi co chia het cho S hay kg?

int kttong(int i)

{ long M=0;//M la tong cac chu so cua K

for(int j=1;j<=i;j++) M=M+X[j];

if (M%S==0) return 1;

else return 0;

}

//kiem tra K bieu dien o co so B co la so thuan nghich hay kg?

int kttn()

{ int d[max];//dm...d1 la bieu dien o co so B cua K

long T=K; int m=0;

do

{ d[++m]=T%B;T=T/B;

}while(T!=0);

int tn=1;

for(int i=1;i<=m/2;i++)

if(d[i]!=d[m-i+1]) {tn=0;break;}

return tn;

}

void Try(int i)

{ for(int j=0;j<=9;j++)

{ if((i!=1&&j!=P)||(i==1&&j!=0&&j!=P))

{

X[i]=j;

if(i>=a&&i<=b)

{ tinhK(i);

if(ktnt()==1&&kttong(i)==1&&kttn()==1)

{

Page 44: Baitap ktlt code

printf("\n%d)%ld",++count,K);

if(count%20==0) getch();

}

}

if(i<b) Try(i+1);

}

}

}

void main()

{

printf("\n1.K co %d den %d chu so",a,b);

printf("\n2.K la so nguyen to");

printf("\n3.Cac chu so cua K phai khac P");

printf("\n4.Tong cac chu so cua K phai chia het cho S");

printf("\n5.Bieu dien theo co so B cua K phai la day thuan nghich");

printf("\nNhap P(0->9):");scanf("%d",&P);

printf("Nhap S:");scanf("%d",&S);

printf("Nhap co so B:");scanf("%d",&B);

Try(1);

}

BÀI TẬP 82: Bài toán mã đi tuần Mã nguồn:#include<iostream>

using namespace std;

int bc[100][100];

int lechX[8] = {2,1,-1,-2,-2,-1,1,2};

int lechY[8] = {1,2,2,1,-1,-2,-2,-1};

int n;

void init(){

for(int i = 0; i<n; i++)

for(int j = 0; j<n; j++)

bc[i][j] = 0;

}

Page 45: Baitap ktlt code

void print(){

cout<<"Thu tu cac buoc di cua quan ma: \n";

for(int i=0; i<n; i++){

for(int j=0; j<n; j++)

cout<<bc[i][j]<<" ";

cout<<endl;

}

}

void knightTour(int j,int x, int y){

int u,v;

for(int i = 0 ;i<8; i++){

u = x + lechX[i];

v = y + lechY[i];

if(0<=u && u<n && 0<=v && v<n && bc[x][y]==0 ){

bc[u][v] = j;

if (j==n*n) print();

else knightTour(j+1,u,v);

bc[u][v] = 0;

}

}

}

void main(){

cout<<"Nhap n= ";

cin>>n;

init();

int x0= 4, y0=4;

bc[x0][y0]=1;

knightTour(2,x0,y0);

cout<<endl;

Page 46: Baitap ktlt code

system("PAUSE");

}

Các pác có biết input như thế nào có thể cho ra output hông?Hông biết code của mình có vấn đề hay không mà chạy hoài không có output nào cả.

Mình thấy bạn nhầm ở điều kiệnif(0<=u && u<n && 0<=v && v<n && bc[x][y]==0 )Ở đây bc[x][y] nên được sửa thành bc[u][v].Thêm nữa, có lẽ bạn chọn vị trí không tốt nên chạy không ra kết quả. Mình sửa hàm KnightTour thành:

Mã nguồn:void KnightTour(int j, int x, int y)

{

int u,v;

if (j > n*n)

{

print();

}

else

{

for (int i = 0 ;i < 8; i++)

{

u = x + lechX[i];

v = y + lechY[i];

if (0 <= u && u < n && 0 <= v && v < n && bc[u][v] == 0)

{

bc[u][v] = j;

knightTour(j+1, u, v);

bc[u][v] = 0;

}

}

}

}

và đặt x0 = 0, y0 = 0 thì chạy cho ra vô số kết quả với n = 8.

--------------------------------------------------------------------------------------------------------------

Công thức truy hồi Xem các dãy số {xn}, {yn}, {zn} được cho theo công thức như sau:

x0=y0=z0=1

với n>=1 thì:

Page 47: Baitap ktlt code

xn=xn-1 + 2yn-1 + 3zn-1

yn=4xn-1 + 5yn-1 + 6zn-1

zn=7xn-1 + 8yn-1 + 9zn-1

Hãy viết hàm (không đệ quy) để tính giá trị của xn, yn, zn khi biết n (nguyên không âm). Hàm này mô tả như sau:

void EvaluateXYZ(int n, float& x, float& y, float& z);

Trong đó, các tham biến x, y, z nhận về các giá trị tương ứng của xn, yn, zn.

Bài này đơn giản là dùng 3 biến để lưu giá trị trước như sau:

Mã nguồn:void EvaluateXYZ(int n, float &x, float &y, float &z) {

float x0 = x = 1, y0 = y = 1, z0 = z = 1;

for (int i=1; i<=n; i++) {

x = x0 + 2*y0 + 3*z0;

y = 4*x0 + 5*y0 + 6*z0;

z = 7*x0 + 8*y0 + 9*z0;

x0 = x;

y0 = y;

z0 = z;

}

}

Bài 35

HD:

#include <stdio.h>

const max=30;//so dinh toi da

int n;//so dinh thuc su

int mtk[max][max];//mang chua ma tran ke

int stplt=0;//bien dem so thanh phan lien thong

//mang danh dau dinh da tham roi hay chua

//tham[i]=0 la i chua tham

//tham[i]=k la i tham roi, va i thuoc thanh phan lien thong thu k

int tham[max];

char *dothi="d:\\dothi.in";

char *ketqua="d:\\ketqua.out";

void DocFile()

{ int i,j;

Page 48: Baitap ktlt code

FILE *f=fopen(dothi,"r");//mo file dothi de doc

fscanf(f,"%d",&n);//doc so dinh cua do thi

//ban dau gan mtk=0

for(i=1;i<=n;i++)

for(j=1;j<=n;j++) mtk[i][j]=0;

//lan luot doc cac canh (i,j) trong file

while(fscanf(f,"%d%d",&i,&j)!=EOF)

mtk[i][j]=mtk[j][i]=1; //gan 1 vao vi tri tuong ung trong mtk

fclose(f);//dong file

}

void DFS1(int i)//duyet mot thanh phan lien thong chua dinh i

{

tham[i]=stplt;//danh dau i tham roi va i thuoc tplt thu stplt

for(int j=1;j<=n;j++)

if(tham[j]==0&&mtk[i][j]==1)//neu j chua tham va j ke i

DFS1(j);//tham j

}

void DFS()

{

//ban dau gan tat ca cac dinh la chua tham

for(int i=1;i<=n;i++) tham[i]=0;

for(i=1;i<=n;i++)//lan luot xet cac dinh i

if(tham[i]==0)//neu dinh i chua tham

{ stplt++;//tang so tplt

DFS1(i);//tham mot tplt chua i

}

}

void GhiFile()

{

FILE *f=fopen(ketqua,"w");//mo file ket qua de ghi

if(stplt==1) fprintf(f,"Do thi lien thong");

else

{

fprintf(f,"Do thi khong lien thong");

for(int i=1;i<=stplt;i++)

{

Page 49: Baitap ktlt code

fprintf(f,"\nThanh phan lien thong thu %d:",i);

for(int j=1;j<=n;j++)

if(tham[j]==i)//neu j thuoc tplt thu i

fprintf(f,"%4d",j);//ghi j vao tplt thu i

}

}

fclose(f);

}

void main()

{

DocFile();

DFS();

GhiFile();

}

BÀI TẬP 84: Bài toán cái túi#include <stdio.h>

#include <conio.h>

//c[i]: gia tri su dung cua vat loai i, a[i]: trong luong vat loai i

float c[100],a[100];

//x: chua phuong an trung gian, xopt: phuong an toi uu

int x[100],xopt[100];

//d: so thu tu cua loai i la d[i]

int d[100],n;//n la so loai vat

/*w la trong luong toi da tui co the chua,

weight: trong luong hien tai cua tui

fopt: gia tri hien tai lon nhat cua tui

cost: gia tri hien tai

*/

float w,weight,fopt,cost;

/* file caitui.dat co dang sau:

4 8 //n=4, b=8

5 3 2 4 //a: trong luong moi loai vat

10 5 3 6 //c: gia tri moi loai vat

*/

void ReadFile()

Page 50: Baitap ktlt code

{

FILE *fin;

int i;

if ((fin = fopen("caitui.dat", "rt"))== NULL)

{

printf("Khong tim thay file caitui.dat.\n");

return ;

}

fscanf(fin,"%d%f",&n,&w);

for (i=0;i<n;i++) fscanf(fin,"%f",&a[i]);

for (i=0;i<n;i++) fscanf(fin,"%f",&c[i]);

fclose(fin);

printf("\nSo loai vat:%d",n);

printf("\nTrong luong cai tui:%0.0f",w);

printf("\nTrong luong cac loai vat:");

for (i=0;i<n;i++) printf("%0.0f ",a[i]);

printf("\nGia tri cac loai vat:");

for (i=0;i<n;i++) printf("%0.0f ",c[i]);

}

void Init()

{

int i,j,k,t;

fopt=0;// gia tri lon nhat =0

weight=0;//trong luong ban dau cua tui=0;

for (i=0; i<n; i++)

d[i]=i+1;

for (i=0; i<n-1; i++)

{

k=i;

for (j=i+1; j<n; j++)

if (c[j]/a[j]>c[k]/a[k]) k=j;

if (k!=i)

{

t=a[i];a[i]=a[k];a[k]=t;

t=c[i];c[i]=c[k];c[k]=t;

t=d[i];d[i]=d[k];d[k]=t;

}

}

Page 51: Baitap ktlt code

}

void KyLuc()

{

if (cost>fopt)

{

for (int i=0; i<n; i++)

{

xopt[i]=x[i]; fopt=cost;

}

}

}

void Try(int i)

{

int j,t;

t=(w-weight)/a[i];//w: suc chua cua tui

for (j=t; j>=0; j--)

{

x[i]=j;

weight=weight+a[i]*x[i];//weight:trong luong tui

cost=cost+c[i]*x[i];//cost: gia tri tui

if (i==n-1) KyLuc();

else

if (cost+c[i+1]*(w-weight)/a[i+1]>fopt) Try(i+1);

weight=weight-a[i]*x[i];

cost=cost-c[i]*x[i];

}

}

void InKq()

{

printf("\nTong gia tri do vat:%0.0f",fopt);

for (int i=0; i<n; i++)

printf("\nso luong do vat loai %d la %d",d[i],xopt[i]);

}

void main()

{

clrscr();

ReadFile();

Page 52: Baitap ktlt code

Init();

Try(0);

InKq();

getch();

}

BÀI TẬP 85: Bài toán người du lịch#include <stdio.h>

#include <conio.h>

#include <values.h>

int n;//so thanh pho

int c[100][100];//ma tran chi phi

int cmin;//chi phi nho nhat trong ma tran chi phi

int tp[100];//tp[i]=0:tp i da di qua, =1 chua di qua

int cost;//chi phi bo phan

int fopt; //gia tri ky luc, gia tri cuoi cung la gia tri toi uu

int x[100];//la mot phuong an

int xopt[100];//la phuong an toi uu

void ReadFile()

{

FILE *fin;

int i,j;

if ((fin = fopen("dulich.dat", "rt"))== NULL)

{

printf("Khong tim thay file dulich.dat.\n");

return ;

}

//doc so thanh pho

fscanf(fin,"%d",&n);

//doc ma tran chi phi

for (i=0;i<n;i++)

for (j=0;j<n;j++)

fscanf(fin,"%d",&c[i][j]);

fclose(fin);

//xuat thong tin de kiem tra

printf("\nSo thanh pho:%d",n);

Page 53: Baitap ktlt code

printf("\nMa tran chi phi:");

for (i=0;i<n;i++)

{

printf("\n");

for (j=0;j<n;j++)

printf("%3d",c[i][j]);

}

}

void Init()

{

int i,j;

cmin=MAXINT;//so kieu int lon nhat

for (i=0;i<n;i++)

{

tp[i]=1;//tat ca tp i deu chua di qua

for (j=0;j<n;j++)//tim cmin

if ( (i!=j)&&(c[i][j]<cmin)) cmin=c[i][j];

}

fopt=MAXINT;//ky luc ban dau

cost=0;//chi phi bo phan

x[0]=0;//tp bat dau di la tp 0

}

void CNKL() //cap nhat ky luc

{

int i,s;

s=cost+c[x[n-1]][x[0]];//cong them chi phi tro ve tp dau

if (s<fopt)//neu chi phi cua hanh trinh nay < ky luc

{

fopt=s;//ghi nhan ky luc moi

for (i=0;i<n;i++) xopt[i]=x[i]; //ghi nhan hanh trinh moi

}

}

void Try(int i)

{

int j;

for (j=1;j<n;j++)

if (tp[j])

{

Page 54: Baitap ktlt code

x[i]=j;

tp[j]=0;//tp j da duoc chon

cost=cost+c[x[i-1]][x[i]];//chi phi bo phan

if (i==n-1) CNKL();

else

if (cost+(n-i+1)*cmin<=fopt) Try(i+1);

tp[j]=1;

cost=cost-c[x[i-1]][x[i]];

}

}

void Result()

{

int i;

printf("\n\nChi phi nho nhat:%d",fopt);

printf("\nHanh trinh co chi phi nho nhat:\n");

for (i=0;i<n;i++)

printf ("%d -> ",xopt[i]+1);

printf ("%d",xopt[0]+1);

}

void main()

{

clrscr();

ReadFile();

Init();

Try(1);

Result();

getch();

}

/*

vi du ve file dulich.dat

6

0 3 93 13 33 9

4 0 77 42 21 16

45 17 0 36 16 28

39 90 80 0 56 7

28 46 88 33 0 25

3 88 18 46 92 0

Page 55: Baitap ktlt code

Co ds la:

Chi phi nho nhat:104

Hanh trinh co chi phi nho nhat:

1->4->6->3->2->5->1

BÀI TOÁN 86: Chuyển từ ma trận kề sang danh sách kề #include <stdio.h>

#include <conio.h>

#include <string.h>

#include <stdlib.h>

#define MAX 10

char *dske="d:\\dske.out";

char *mtke="d:\\mtke.in";

char *dscanh="d:\\dscanh.out";

void chuyen_mtke()

{ int i,j,mtk[MAX][MAX],n,m=0;

FILE *fp;

fp = fopen(mtke,"r");

fscanf(fp,"%d",&n); //doc so dinh cua do thi

printf("\n So dinh do thi:%d",n);

for(i=1; i<=n; i++)

for(j=1; j<=n;j++)

{ fscanf(fp,"%5d",&mtk[i][j]);

if(mtk[i][j]==1)

m++; // dem so canh cua do thi

}

fclose(fp);

printf("\n Ma tran ke doc duoc:\n");

for(i=1; i<=n; i++)

{ for(j=1;j<=n;j++)

printf("%5d",mtk[i][j]);

printf("\n");

}

//ghi lai danh sach ke theo khuon dang

fp = fopen(dske,"w");

printf("\n So dinh:%d",n);

fprintf(fp,"%5d\n",n);

Page 56: Baitap ktlt code

printf("\n Danh sach ke:\n");

for(i=1; i<=n; i++)

{ for(j=1;j<=n;j++)

if(mtk[i][j])

{printf("%5d",j);

fprintf(fp,"%5d",j);

}

printf("\n");

fprintf(fp,"\n");

}

fclose(fp);

//ghi lai danh sach canh theo khuon dang

m = m/2; //lay so canh cua do thi

fp = fopen(dscanh,"w");

fprintf(fp,"%d%5d",n,m);

printf("\n So dinh : %d, so canh:%d",n,m);

printf("\n Danh sach canh:");

for(i=1; i<n; i++){

for(j=i+1; j<=n; j++)

{ if(mtk[i][j])

{printf("\n %3d%5d",i,j);

fprintf(fp,"\n%d%5d",i,j);

}

}

fclose(fp);

}

void main()

{

chuyen_mtke();

getch();

}

BÀI TẬP 87: Chuyển từ danh sách canh sang ma trận kề, danh sách kề#include <stdio.h>

#include <conio.h>

#include <string.h>

#include <stdlib.h>

Page 57: Baitap ktlt code

#define MAX 10

char *dske="d:\\dske.out";

char *mtke="d:\\mtke.out";

char *dscanh="d:\\dscanh.in";

void chuyen_dscanh()

{ int i,j,dsc[MAX][MAX],mtk[MAX][MAX],n,m=0;

FILE *fp;

fp = fopen(dscanh,"r");

fscanf(fp,"%d%5d",&n,&m); //doc so dinh va so canh cua do thi

printf("\n So dinh do thi:%d, so canh cua do thi:%d",n,m);

for(i=1; i<=m; i++)

for(j=1; j<=m/2;j++)

fscanf(fp,"%5d",&dsc[i][j]);//doc ds canh de in ra man hinh

fclose(fp);

printf("\n Danh sach canh doc duoc:\n");

for(i=1; i<=m; i++)

{ for(j=1;j<=m/2;j++)

printf("%5d",dsc[i][j]);

printf("\n");

}

//bat dau gan ma tran ke =0

for(i=1; i<=n; i++)

for(j=1; j<=n;j++)

mtk[i][j]=0;

//lan luot doc cac canh (i,j) trong file

fp=fopen(dscanh,"r");

fscanf(fp,"%d%5d",&n,&m); //doc so dinh va so canh cua do thi

while(fscanf(fp,"%d%d",&i,&j)!=EOF)

mtk[i][j]=mtk[j][i]=1;

fclose(fp);

//ghi lai ma tran ke theo khuon dang

fp = fopen(mtke,"w");

printf("\n So dinh:%d",n);

fprintf(fp,"%5d\n",n);

printf("\n Ma tran ke:\n");

for(i=1; i<=n; i++)

Page 58: Baitap ktlt code

{ for(j=1;j<=n;j++)

printf("%5d",mtk[i][j]);

fprintf(fp,"%5d",mtk[i][j]);

printf("\n");

fprintf(fp,"\n");

}

fclose(fp);

//ghi lai danh sach ke theo khuon dang

fp = fopen(dske,"w");

printf("\n So dinh:%d",n);

fprintf(fp,"%5d\n",n);

printf("\n Danh sach ke:\n");

for(i=1; i<=n; i++)

{ for(j=1;j<=n;j++)

if(mtk[i][j])

{printf("%5d",j);

fprintf(fp,"%5d",j);

}

printf("\n");

fprintf(fp,"\n");

}

fclose(fp);

}

void main()

{

chuyen_dscanh();

getch();

}

Bài 36

HD:

* Cach 1:

#include <stdio.h>

#include <conio.h>

#define MAX 100//so vat toi da

int n;//so vat thuc su

Page 59: Baitap ktlt code

int B;//suc chua cai tui

int A[MAX];//mang chua trong luong cua cac vat: a1,...,an

int C[MAX];//mang chua gia tri cua cac vat: c1,...,cn

//mot phuong an la mot day nhi phan x1,...,xn (xi=0/1)

int X[MAX];//mang chua phuong an hien tai

//phuong an toi uu la phuong an cho gia tri lon nhat

int XOPT[MAX];//mang chua phuong an toi uu: xopt[i]=0/1

//gia tri toi uu la gia tri su dung ung voi phuong an toi uu

int FOPT;//mang chua gia tri toi uu

int stop=0;//stop=1 la ngung sinh day nhi phan ke tiep

char *filename="d:\\data.in";

void DocFile()

{

FILE *fp = fopen(filename,"r");//mo file du lieu de doc

fscanf(fp, "%d%d", &n,&B);//doc so vat n va suc chua cai tui B

printf("\n So vat:%d",n);

printf("\n suc chua cai tui:%d",B);

printf("\n gia tri cua moi vat:");

for(int i=1; i<=n; i++) //doc gia tri cua moi vat c1,...,cn

{

fscanf(fp,"%d",&C[i]);

printf("%4d",C[i]);

}

printf("\n trong luong cua moi vat:");

for(i=1; i<=n; i++)//doc trong luong moi vat: a1,...,an

{

fscanf(fp,"%d",&A[i]);

printf("%4d",A[i]);

}

fclose(fp);

}

void KhoiTao()

{

FOPT = -32000; //gan gia tri toi uu ban dau

//gan phuong an hien tai ban dau: x1=x2=...=xn=0

//va phuong an toi uu ban dau: xopt[1]=xopt[2]=...=xopt[n]=0

Page 60: Baitap ktlt code

for(int i=1; i<=n; i++)

{

X[i]=0;

XOPT[i]=0;

}

}

void DayNhiPhanKe()//tim day nhi phan ke tiep

{

int i=n;

while(i>0 && X[i]==1) {X[i]=0;i--;}

if( i==0) stop=1;

else X[i]=1;

}

void CapNhatPATU()//cap nhat phuong an toi uu

{ //X1,...,Xn la day nhi phan ung voi phuong an hien tai

//S la tong trong luong cac vat ung voi phuong an hien tai

//P la tong gia tri cac vat ung voi phuong an hien tai

int S=0, P=0;

for( int i=1; i<=n ; i++)//tinh S va P

{

S = S + A[i] * X[i];

P = P + C[i] * X[i];

}

//Neu phuong an hien tai co tong trong luong cac vat<= suc chua cai tui

//va tong gia tri cac vat > phuong an toi uu tam thoi thi cap nhat

if ( S<=B && FOPT < P)

{

FOPT = P; // Cap nhat gia tri toi uu moi

for(i=1; i<=n; i++) // Cap nhat phuong an toi uu moi

XOPT[i] = X[i];

}

}

void GhiFile()

{ // Dua ra ket qua toi uu

FILE* fp = fopen("ketqua.out","w");//mo file ketqua de ghi

fprintf(fp,"%d\n",FOPT);//ghi gia tri toi uu vao file

Page 61: Baitap ktlt code

printf("\n Gia tri toi uu :%d", FOPT);

printf("\n Phuong an toi uu:");

for(int i=1; i<=n; i++)//ghi phuong an toi uu vao file

{

printf("%3d",XOPT[i]);

fprintf(fp,"%3d",XOPT[i]);

}

fclose(fp);

}

void main()

{

DocFile(); KhoiTao();

while(stop==0)//lan luot xet tat ca cac day nhi phan ung voi moi phuong an

{

CapNhatPATU();

DayNhiPhanKe();

}

GhiFile();

}

* Cach 2:

#include <stdio.h>

#include <conio.h>

#define MAX 100//so vat toi da

int n;//so vat thuc su

int B;//suc chua cai tui

int A[MAX];//mang chua trong luong cua cac vat: a1,...,an

int C[MAX];//mang chua gia tri cua cac vat: c1,...,cn

//mot phuong an la mot day nhi phan x1,...,xn (xi=0/1)

int X[MAX];//mang chua phuong an hien tai

//phuong an toi uu la phuong an cho gia tri lon nhat

int XOPT[MAX];//mang chua phuong an toi uu: xopt[i]=0/1

//gia tri toi uu la gia tri su dung ung voi phuong an toi uu

int FOPT;//mang chua gia tri toi uu

char *filename="d:\\data.in";

void DocFile()

Page 62: Baitap ktlt code

{ FILE *fp = fopen(filename,"r");//mo file du lieu de doc

fscanf(fp, "%d%d", &n,&B);//doc so vat n va suc chua cai tui B

printf("\n So vat:%d",n);

printf("\n suc chua cai tui:%d",B);

printf("\n gia tri cua moi vat:");

for(int i=1; i<=n; i++) //doc gia tri cua moi vat c1,...,cn

{

fscanf(fp,"%d",&C[i]);

printf("%4d",C[i]);

}

printf("\n trong luong cua moi vat:");

for(i=1; i<=n; i++)//doc trong luong moi vat: a1,...,an

{

fscanf(fp,"%d",&A[i]);

printf("%4d",A[i]);

}

fclose(fp);

FOPT = -32000; //gan gia tri toi uu ban dau

}

void CapNhatPATU()//cap nhat phuong an toi uu

{ //X1,...,Xn la day nhi phan ung voi phuong an hien tai

//S la tong trong luong cac vat ung voi phuong an hien tai

//P la tong gia tri cac vat ung voi phuong an hien tai

int S=0, P=0;

for( int i=1; i<=n ; i++)//tinh S va P

{

S = S + A[i] * X[i];

P = P + C[i] * X[i];

}

//Neu phuong an hien tai co tong trong luong cac vat<= suc chua cai tui

//va tong gia tri cac vat > phuong an toi uu tam thoi thi cap nhat

if ( S<=B && FOPT < P)

{ FOPT = P; // Cap nhat gia tri toi uu moi

for(i=1; i<=n; i++) // Cap nhat phuong an toi uu moi

XOPT[i] = X[i];

}

Page 63: Baitap ktlt code

}

void Try(int i)//lan luot xet tat ca cac phuong an

{

for(int j=0;j<=1;j++)

{

X[i]=j;

if(i==n) CapNhatPATU();

else Try(i+1);

}

}

void GhiFile()

{ // Dua ra ket qua toi uu

FILE* fp = fopen("ketqua.out","w");//mo file ketqua de ghi

fprintf(fp,"%d\n",FOPT);//ghi gia tri toi uu vao file

printf("\n Gia tri toi uu :%d", FOPT);

printf("\n Phuong an toi uu:");

for(int i=1; i<=n; i++)//ghi phuong an toi uu vao file

{

printf("%3d",XOPT[i]);

fprintf(fp,"%3d",XOPT[i]);

}

fclose(fp);

}

void main()

{

DocFile();

Try(1);

GhiFile();

}

* Cach 3:

#include <stdio.h>

#include <conio.h>

#define MAX 100//so vat toi da

int n;//so vat thuc su

int B;//suc chua cai tui

Page 64: Baitap ktlt code

int A[MAX];//mang chua trong luong cua cac vat: a1,...,an

int C[MAX];//mang chua gia tri cua cac vat: c1,...,cn

//mot phuong an la mot day nhi phan x1,...,xn (xi=0/1)

int X[MAX];//mang chua phuong an hien tai

//phuong an toi uu la phuong an cho gia tri lon nhat

int XOPT[MAX];//mang chua phuong an toi uu: xopt[i]=0/1

//gia tri toi uu la gia tri su dung ung voi phuong an toi uu

int FOPT;//mang chua gia tri toi uu

char *filename="d:\\data.in";

int S=0,P=0;

void DocFile()

{ FILE *fp = fopen(filename,"r");//mo file du lieu de doc

fscanf(fp, "%d%d", &n,&B);//doc so vat n va suc chua cai tui B

printf("\n So vat:%d",n);

printf("\n suc chua cai tui:%d",B);

printf("\n gia tri cua moi vat:");

for(int i=1; i<=n; i++) //doc gia tri cua moi vat c1,...,cn

{

fscanf(fp,"%d",&C[i]);

printf("%4d",C[i]);

}

printf("\n trong luong cua moi vat:");

for(i=1; i<=n; i++)//doc trong luong moi vat: a1,...,an

{

fscanf(fp,"%d",&A[i]);

printf("%4d",A[i]);

}

fclose(fp);

FOPT = -32000; //gan gia tri toi uu ban dau

}

void Try(int i)//lan luot xet tat ca cac phuong an

{

for(int j=0;j<=1;j++)

{

X[i]=j;S=S+A[i]*X[i];P=P+C[i]*X[i];

if(i==n)

Page 65: Baitap ktlt code

{

if ( S<=B && FOPT < P)

{ FOPT = P; //Cap nhat gia tri toi uu moi

for(int k=1; k<=n; k++) // Cap nhat phuong an toi uu moi

XOPT[k] = X[k];

}

}

else

if(S<B) Try(i+1);

S=S-A[i]*X[i];P=P-C[i]*X[i];

}

}

void GhiFile()

{ // Dua ra ket qua toi uu

FILE* fp = fopen("ketqua.out","w");//mo file ketqua de ghi

fprintf(fp,"%d\n",FOPT);//ghi gia tri toi uu vao file

printf("\n Gia tri toi uu :%d", FOPT);

printf("\n Phuong an toi uu:");

for(int i=1; i<=n; i++)//ghi phuong an toi uu vao file

{ printf("%3d",XOPT[i]);

fprintf(fp,"%3d",XOPT[i]);

}

fclose(fp);

}

void main()

{

DocFile();

Try(1);

GhiFile();

}

Bài 38

#include <stdio.h>

#include <math.h>

#include <conio.h>

int count=0;

Page 66: Baitap ktlt code

/* kiem tra K co la nguyen to kg? */

int ktnt(long K)

{ int nt=1;

if(K==1)

nt=0;

for(long i=2;i<=sqrt(K);i++)

if(K%i==0) {nt=0;break;}

return nt;

}

/* ktra cac chu so cua K khac 0 va nguyen to */

int ktChuso(long K)

{int cs,flag=1;

while(K>0)

{

cs=K%10;

K=K/10;

if(cs==0||ktnt(cs)==0)

flag=0;

}

if(flag)

return 1;

else

return 0;

}

/* Kiem tra tong cac chu so cua K co la ngto */

int ktTong(long K)

{long M=0;//M la tong cac chu so cua K

int cs;

while(K>0)

{

cs=K%10;

K=K/10;

M+=cs;

}

if(ktnt(M))

Page 67: Baitap ktlt code

return 1;

else

return 0;

}

/* Dao nguoc so K cung la ngto */

int ktDaoso(long K)

{int cs;

long Sodao=0;

while(K>0)

{

cs=K%10;

K=K/10;

Sodao=Sodao*10+cs;

}

if(ktnt(Sodao))

return 1;

else

return 0;

}

/* tim so K */

void TimK()

{

for(long K=10000;K<=99999;K++)

{ if(ktnt(K)==1&&ktTong(K)==1&&ktChuso(K)==1&&ktDaoso(K)==1)

{

printf("\n%d)%ld",++count,K);

if(count%20==0) getch();

}

}

}

void main()

{

printf("\n1.K la so co 5 chu so");

printf("\n2.K la so nguyen to");

printf("\n3.Dao nguoc cac chu so cua K cung la so nguyen to");

Page 68: Baitap ktlt code

printf("\n4.Tong cac chu so cua K cung la so nguyen to");

printf("\n5.Cac chu so trong K deu khac 0 va la so ngto 1 chu so");

TimK();getch();

}

bai 6 trang 103: vd pt 2x1+3x2+3x3=5 (n=3,b=5, a1=2, a2=a3=3)se co hai nghiem la: x=(1,0,1) va x=(1,1,0)

#include <stdio.h>

#include <conio.h>

int x[100],a[100],n,b,count,s;

void init()

{

printf("n="); scanf("%d",&n);

for (int i=0;i<n;i++)

{

printf("a%d=",i+1); scanf("%d",&a[i]);

}

printf("b="); scanf("%d",&b);

count=0; s=0;

}

void result()

{

count++;

printf("\n%3d) ",count);

for (int i=0;i<n;i++) printf("%2d",x[i]);

}

void Try(int i)

{

for (int j=0; j<=1; j++)

{

if (s<=b) //dk de chap nhan x[i]=j la a[1]*x[1]+...+a[i-1]*x[i-1]<=b

{

x[i]=j; //xac dinh x[i]

s=s+a[i]*x[i]; //cap nhat bien trang thai s

if (i==n-1)

{

if (s==b) result();

}

else Try(i+1);

Page 69: Baitap ktlt code

s=s-a[i]*x[i];//tra lai gia tri cu cua bien trang thai s

}

}

}

void main()

{

clrscr();

init();

Try(0);

getch();

}

bai 7 trang 103vd pt: x1+2x2+3x3=20 (n=3,b=20, a1=1,a2=2,a3=3)

se co 44 nghiem la: x=(0,1,6),.., x=(2,2,4),...,x=(20,0,0)

#include <stdio.h>

#include <conio.h>

int x[100],a[100],n,b,count,s;

void init()

{

printf("n="); scanf("%d",&n);

for (int i=0;i<n;i++)

{

printf("a%d=",i+1);

scanf("%d",&a[i]);

}

printf("b="); scanf("%d",&b);

count=0; s=0;

}

void result()

{

count++;

printf("\n%3d) ",count);

for (int i=0;i<n;i++) printf("%2d",x[i]);

}

void Try(int i)

{

for (int j=0; j<=b/a[i]; j++)//cac gia tri x[i] co the nhan

Page 70: Baitap ktlt code

{

if (s<=b) //dk de chap nhan x[i]=j la a[1]*x[1]+...+a[i-1]*x[i-1]<=b

{

x[i]=j; //xac dinh x[i]

s=s+a[i]*x[i]; //cap nhat bien trang thai s

if (i==n-1)

{

if (s==b) result();

}

else Try(i+1);

s=s-a[i]*x[i];//tra lai gia tri cu cua bien trang thai s

}

}

}

void main()

{

clrscr();

init();

Try(0);

getch();

}

bai 9 trang 104vd: N=5, tach N thanh 1 so, 2 so, 3 so, 4 so, 5 so

5, 1+4, 2+3, 1+1+3, 1+2+2, 1+1+1+2, 1+1+1+1+1

#include <stdio.h>

#include <conio.h>

int x[100],N,count,s,k,n;

void init()

{

printf("N="); scanf("%d",&N);

count=0; s=0; k=1; n=0;

}

void result()

{

count++;

printf("\n%3d) ",count);

for (int i=0;i<n;i++) printf("%2d",x[i]);

Page 71: Baitap ktlt code

}

void Try(int i)

{

for (int j=k; j<=N; j++)//cac kha nang cua x[i]

{

if (s<N)

{

x[i]=j; //xac dinh x[i]

s=s+x[i]; k=j; n++; //cap nhat bien trang thai s,k,n

if (s==N) result();

else if (s<N) Try(i+1);

s=s-x[i]; n--; //tra lai gia tri cu cua bien trang thai s

}

}

}

void main()

{

clrscr();

init();

Try(0);

getch();

}

bai 10 trang 104: hinh vuong than biY tuong: (moi ma phuong la mot hoan vi)

- tim tat ca cac hoan vi cua tap {1,...,n*n}

- Kiem tra hoan vi nao la ma phuong thi in hoan vi do

#include <stdio.h>

#include <conio.h>

int x[100], b[100],n,count;

int a[10][10];

void init()

{

printf("n=");

scanf("%d",&n);

for (int i=0; i<n*n; i++) b[i]=1; //i chua su dung

count=0;

}

Page 72: Baitap ktlt code

int test() //kiem tra hoan vi co la ma phuong

{

int i, j, k, s, s0, s1, s2;

//doi hoan vi thanh ma tran de de kiem tra t/c ma phuong

i=0; j=0;

for (k=0;k<n*n;k++)

{

a[i][j]=x[k]; j++;

if (j==n) {i++; j=0;}

}

//kiem tra tong moi dong phai bang nhau

s0=0;//gia tri dong 0

for (j=0;j<n;j++)

s0=s0+a[0][j];

for (i=1;i<n;i++)

{

s=0;//gia tri dong i

for (j=0;j<n;j++)

s=s+a[i][j];

//neu dong i khac dong 0 thi khong phai ma phuong

if (s!=s0) return 0;

}

//kiem tra cot

s0=0;//gia tri cot 0

for (i=0;i<n;i++)

s0=s0+a[i][0];

for (j=1;j<n;j++)

{

s=0;//gia tri cot j

for (i=0;i<n;i++)

s=s+a[i][j];

//neu cot j khac cot 0 thi khong phai ma phuong

if (s!=s0) return 0;

}

//kiem tra duong cheo

Page 73: Baitap ktlt code

s1=0,s2=0;

for (i=0;i<n;i++)

{

s1=s1+a[i][i];

s2=s2+a[i][n-1-i];

}

if (s1!=s2) return 0;

return 1; //hoan vi la ma phuong

}

void result()

{

if (test())

{

count++;

printf("\nMa phuong %d:\n",count);

for (int i=0;i<n;i++)

{

for (int j=0;j<n;j++)

printf("%3d",a[i][j]);

printf("\n");

}

}

}

void Try(int i)

{

for (int j=0; j<n*n; j++)

{

if (b[j])

{

x[i]=j+1; b[j]=0;//j su dung roi

if (i==n*n-1) result();

else Try(i+1);

b[j]=1; //tra lai trang thai cu, j chua su dung

}

}

}

Page 74: Baitap ktlt code

void main()

{

clrscr();

init();

Try(0);

getch();

}