BẢN BÁO CÁO THỰC HÀNH TOÁN RỜI RẠC potx

23 1.1K 18
BẢN BÁO CÁO THỰC HÀNH TOÁN RỜI RẠC potx

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

TH Toán Rời Rạc  Trang 1 TRƯỜNG ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG KHOA CÔNG NGHỆ THÔNG TIN  BẢN BÁO CÁO THỰC HÀNH TOÁN RỜI RẠC Giáo viên hướng dẫn: Thầy Nguyễn Văn Nguyên Nhóm : Lớp : 07T1 Sinh viên thực hiện : Nguyễn Thị Quỳnh Mai Đà Nẵng – Tháng 8/2010 SV: Nguyễn Thị Quỳnh Mai Lớp 07T1 TH Toán Rời Rạc  Trang 2 LỜI NÓI ĐẦU Ngày nay, Công nghệ thông tin là một trong những ngành đang phát triển rất mạnh mẽ và có ảnh hưởng sâu rộng đến mọi mặt đời sống. Nó là nền tảng của nền kinh tế tri thức, là thước đo trình độ phát triển của một quốc gia.Vì vậy, việc đào tạo đội ngũ kỹ sư công nghệ thông tin có chất lượng đòi hỏi phải được chú trọng và đầu tư đúng mức. Đại học là môi trường cơ bản cung cấp kiến thức chuyên môn, giúp sinh viên hình thành và phát triển những kĩ năng cần thiết cho công việc. Vì vậy, học đi đôi với hành luôn là phương châm đào tạo hàng đầu trong các trường đại học hiện nay. Cùng với học phần lý thuyết, học phần Thực Hành Toán Rời Rạc giúp nâng cao khả năng tư duy của sinh viên. Trên cơ sở đề bài thực hành được nhận, sinh viên phải biết cách phân tích và cài đặt để giải quyết các bài toán liệt kê, lập lịch, … nhằm giải quyết những bài toán có tính ứng dụng thực tế cao. Em xin chân thành cảm ơn giáo viên hướng dẫn – thầy Nguyễn Văn Nguyên đã giúp đỡ và chỉ dẫn em hoàn thành bài báo cáo này. Đà Nẵng, ngày 9 tháng 7 năm 2010 SV: Nguyễn Thị Quỳnh Mai Lớp 07T1 TH Toán Rời Rạc  Trang 3 MỤC LỤC I. BÀI 1: BÀI TOÁN ĐẾM – BÀI TOÁN LIỆT KÊ 4 1.Đề bài: 4 2.Thuật toán: 4 3.Mã nguồn: 6 4.Demo: 10 II. BÀI 2:BÀI TOÁN TỐI ƯU RỜI RẠC 12 1.Đề bài: 12 2.Thuật toán: 12 3.Mã nguồn: 13 4.Demo: 17 III.BÀI 3: BÀI TOÁN TRÊN ĐỒ THỊ 18 1.Đề bài: 18 2.Thuật toán: 18 3.Mã nguồn: 19 4.Demo: 22 SV: Nguyễn Thị Quỳnh Mai Lớp 07T1 TH Toán Rời Rạc  Trang 4 I. BÀI 1: BÀI TOÁN ĐẾM – BÀI TOÁN LIỆT KÊ 1.Đề bài: 1. Đếm số xâu nhị phân độ dài n: a) Bất kỳ. b) Không có hai bit 0 kề nhau. c) Có ít nhất hai bit 0 kề nhau. 2. Viết chương trình liệt kê tất cả các xâu nhị phân độ dài n như yêu cầu của bài toán 1. Liệt kê có số thứ tự để kiểm tra kết quả đã đếm được. Thử nhập với nhiều giá trị khác nhau của n. Lưu ý các trường hợp n=1 và n=2. 3. Viết chương trình nhập một xâu chữ gồm n chữ cái hoa (A Z)-trong đó có một số chữ cái lặp. Liệt kê tất cả các cách sắp xếp n chữ cái này. Có đếm tổng số cách sắp xếp. 4. Xét phương trình nguyên: x 1 +x 2 + +x n =k với x i ≥0 ∀i=1 k. Viết chương trình nhập n,k và in ra tất cả các nghiệm của phương trình.Có đếm tổng số nghiệm. 2.Thuật toán: 2.1. Đếm số xâu nhị phân độ dài n: a. Bất kỳ: Số xâu nhị phân độ dài n chính là 2 n . b. Không có hai bit 0 kề nhau: - Nếu n=1: có 2 xâu. - Nếu n=2: có 3 xâu. - Từ n>2 trở đi thì số xâu nhị phân độ dài n chính bằng tổng của số xâu nhị phân độ dài n-1 và số xâu nhị phân độ dài n-2. c. Có ít nhất 2 bit 0 gần nhau: Số xâu cần tìm chính bằng số xâu tìm được ở câu a trừ đi số xâu tìm được ở câu b. 2.2. Thuật toán liệt kê các xâu nhị phân: Để giải quyết bài toán này,ta sẽ xây dựng các hàm và dùng thuật toán quay lui để giải  Thuật toán cụ thể được mô tả như sau: • Khai báo biến toàn cục:mảng s[100],n,d=0; là kiểu nguyên • Cần tạo hàm print(tham số);Lke(tham số); - void print(tham số): 1.Khai báo biến k kiểu nguyên; 2.Gán k=0 và lặp cho tới khi đủ cấu hình Cứ mỗi bước lặp thì in ra phần tử của mảng s Tăng biến đếm lên 1 đơn vị d++ SV: Nguyễn Thị Quỳnh Mai Lớp 07T1 TH Toán Rời Rạc  Trang 5 - void Lke(tham số): 1.Khai báo biến j kiểu nguyên; 2.Gán j=0 và lặp cho tới khi j=1 -Cứ mỗi bước gán j vào cho mảng s -Nếu đủ cấu hình thì in mảng s -Khác thì quay lui lại hàm Lke(thamso+1) - Hàm main(): a) Khai báo i kiểu nguyên; b) Quét giá trị độ dài xâu nhị phân với n đã khai báo toàn cục, n>=1; c) Gọi hàm Lke(0); truyền tham số i=0 cho lần đầu tiên gọi hàm; d) In ra số xâu nhị phân đếm được:printf(“%d”,d); 2.3. Liệt kê tổ hợp không lặp của xâu chữ cái: Ta dựa vào phương pháp sinh. Bao gồm các bước: Bước 1 : Xây dựng cấu hình đầu tiên cho xâu theo thứ tự từ điển Xắp xếp lại xâu theo chiều giảm a[i]>=a[i+1] với i= 1,1 −n . In ra cấu hình đầu tiên này và biến đếm số cách sắp xếp được khởi tạo giá trị bằng 1. Bước 2 : Lặp cho tới khi đạt được cấu hình cuối có dạng a[i]<=a[i+1] với i= 1,1 −n . Trong quá trình lặp sinh xâu kế tiếp bằng cách hoán đổi vị trí 2 phần tử a[i] ≠ a[j] cho nhau .Điều kiện của i là tất cả các phần tử của xâu ở bên trái vị trí i được sắp xếp theo chiều tăng trừ phần tử i .Vì các phần tử của xâu được lưu vào vị trí từ 0 đến n-1 nên với i=n chính là điều kiện để thoát khỏi vòng lặp .Điều kiện của j là 1 trong i-1 phần tử bên trái của phần tử i có giá trị nhỏ nhất nhưng a[j]>a[i] .Vì dãy bên trái của phần tử thứ i là dãy tăng do đó j chính là vị trí của phần tử đầu tiên lớn hơn a[i] nếu j=1 i-1 .Sau khi hoán vị a[i] và a[j] cho nhau ta sắp xếp lại tất cả các phần tử bên trái i theo chiều giảm, in ra cấu hình mới của xâu và tăng biến đếm lên. 2.4. Giải phương trình: x 1 + x 2 + x 3 + … + x n = k - Khai báo biến. - Khai báo thêm mảng a[i] để in ra các nghiệm của phương trình. - Nhập dữ liệu n và k. - Dùng bài toán chỉnh hợp lặp chập n của k+1 phần tử (0,1….,k): SV: Nguyễn Thị Quỳnh Mai Lớp 07T1 TH Toán Rời Rạc  Trang 6 + Khai báo thêm biến “sum” + Nếu k=0 thì có nghiệm duy nhất x 1 = x 2 = … = x n = 0; + Ngược lại gán a[i]=0; Thay đổi a[i] để có a[i] kế tiếp theo bài toán chỉnh hợp lặp. Gán sum=a[i]; nếu (sum =k) in kết qủa a[i]; - Thuật toán chỉnh hợp lặp chập k của n phần tử (phương pháp liệt kê) Void Lke(int n,int k){ For(i=1;i<=k;i++) s[i]=1; Print(s); For(dem=2;dem<=Fkn; dem++) { i=k; while(s[i]==n) i ; s[i]++; for(j=i+1;j<=k;j++) s[j]=1; print(s); } } 3.Mã nguồn: - Câu 1: #include<conio.h> #include<stdio.h> #include<math.h> int DemXau1(int n); int DemXau2(int n); int DemXau3(int n); void main(){ clrscr(); int n; printf("Enter n="); scanf("%d",&n); printf("\nSo xau nhi phan bat ky do dai %d: %d xau.",n,DemXau1(n)); printf("\nSo xau nhi phan ko co 2 bit 0 ke nhau: %d xau.",DemXau2(n)); printf("\nSo xau nhi phan co it nhat 2 bit 0 ke nhau: %d xau.",DemXau3(n)); getch(); } int DemXau1(int n){ return pow(2,n); } int DemXau2(int n){ if(n==1) return 2; if(n==2) return 3; else return DemXau2(n-1)+DemXau2(n-2); SV: Nguyễn Thị Quỳnh Mai Lớp 07T1 TH Toán Rời Rạc  Trang 7 } int DemXau3(int n){ return DemXau1(n)-DemXau2(n); } - Câu 2: #include<conio.h> #include<stdio.h> #include<math.h> int n,s[50]; void Lke1(int n); void Lke2(int n); void Lke3(int n); void print(); void main(){ clrscr(); printf("Enter n="); scanf("%d",&n); printf("\n\nSo xau nhi phan bat ky do dai %d:\n ",n); Lke1(n); printf("\n\nSo xau nhi phan ko co 2 bit 0 ke nhau:\n"); Lke2(n); printf("\n\nSo xau nhi phan co it nhat 2 bit 0 ke nhau:\n"); Lke3(n); getch(); } // void Lke1(int n){ int dem=1; for(int i=0;i<n;i++) s[i]=0; printf("\n%2d/",dem); print();//in xau 000 00 for(dem=2;dem<=pow(2,n);dem++){ i=n-1; while(s[i]==1) i ; s[i]++; for(int j=i+1;j<n;j++) s[j]=0; printf("\n%2d/",dem); print(); } } // void Lke2(int n){ int dem=1,kt=0,k=0; for(int i=1;i<=n;i++) s[i]=0; for(dem=2;dem<=pow(2,n);dem++){ kt=0; i=n; while(s[i]==1) i ; s[i]++; for(int j=i+1;j<=n;j++) s[j]=0; SV: Nguyễn Thị Quỳnh Mai Lớp 07T1 TH Toán Rời Rạc  Trang 8 for(i=1;i<n;i++) if(s[i]==0 && s[i+1]==0) kt=1; if(kt==0){ k++; printf("\n%2d/",k); print(); } } } // void Lke3(int n){ int dem=1,kt=0,k=1; for(int i=0;i<n;i++) s[i]=0; printf("%2d/",k); print(); for(dem=2;dem<=pow(2,n);dem++){ kt=0; i=n; while(s[i]==1) i ; s[i]++; for(int j=i+1;j<=n;j++) s[j]=0; for(i=1;i<n;i++) if(s[i]==0 && s[i+1]==0) kt=1; if(kt!=0){ k++; printf("\n%2d/",k); print(); } } } void print(){ for(int i=1;i<=n;i++) printf("%d",s[i]); } - Câu 3: #include<conio.h> #include<stdio.h> #include<string.h> void Lke(char a[],int n); void print(char a[]); void Daygiam(int n,char a[]); void main(){ clrscr(); char a[100]; int n,kt=1; do{ kt=1; printf("\nEnter the string: "); gets(a); n=strlen(a) ; for(int i=0;i<n;i++) if(a[i]<65 || a[i]>90) kt=0; SV: Nguyễn Thị Quỳnh Mai Lớp 07T1 TH Toán Rời Rạc  Trang 9 if(kt==0 || n==0) { printf("Error! Retry"); } }while(kt==0 || n==0); printf("\nXau vua nhap la: %s",a); printf("\nCac hoan vi ko lap:\n"); Lke(a,n); getch(); } void Lke(char a[],int n){ int i1=1,i2,count=1; int x; Daygiam(n,a); printf("%7d.",count); print(a); while(i1<n){ i1=1; while(a[i1-1]<=a[i1] && i1<n) i1++; i2=0; while(a[i2]<=a[i1] && i2<i1) i2++; x=a[i1]; a[i1]=a[i2]; a[i2]=x; Daygiam(i1,a); if(i1<n){ count++; printf("%7d.",count); print(a); if(count%5==0) printf("\n"); } } printf("\nCo %d hoan vi.",count); } void print(char a[]){ printf("%s",a); } void Daygiam(int n,char a[]){ int x; for(int i=0;i<n;i++) for(int j=i;j<n;j++){ if(a[i]<a[j]){ x=a[i]; a[i]=a[j]; a[j]=x; } } } - Câu 4: #include<conio.h> #include<stdio.h> #include<math.h> int s[50]; void Giaiptr(int n,int k); void print(int n); SV: Nguyễn Thị Quỳnh Mai Lớp 07T1 TH Toán Rời Rạc  Trang 10 void main(){ clrscr(); int n,k; printf("Enter n="); scanf("%d",&n); printf("k="); scanf("%d",&k); Giaiptr(n,k); getch(); } void Giaiptr(int n,int k){ int i,j,sum=0,c,count=0; for(i=1;i<=n;i++) s[i]=0; printf("\nNghiem cua ptr: "); if(k==0) { count++; printf("\n%4d.",count); print(n); } else{ for(c=2;c<=pow(k+1,n);c++){ sum=0; i=n; while(s[i]==k) i ; s[i]++; for(j=i+1;j<=n;j++) s[j]=0; for(i=1;i<=n;i++) sum+=s[i]; if(sum==k){ count++; printf("\n%4d.",count); print(n); } } } printf("\n\nPhuong trinh co %d nghiem",count); } void print(int n){ for(int i=1;i<=n;i++) printf("%2d",s[i]); } 4.Demo: - Câu 1: SV: Nguyễn Thị Quỳnh Mai Lớp 07T1 [...]...TH Toán Rời Rạc  Trang 11 - Câu 2: - Câu 3: - Câu 4: SV: Nguyễn Thị Quỳnh Mai Lớp 07T1 TH Toán Rời Rạc  Trang 12 II BÀI 2:BÀI TOÁN TỐI ƯU RỜI RẠC 1.Đề bài: 1 Viết chương trình nhập n là số chi tiết cần gia công và nhập thời gian gia công trên hai máy của từng chi tiết Tính và in thời gian hoàn thành gia công nhanh nhất 2 Viết chương trình nhập n là số thành phố và nhập ma trận... chi phí C Do đó, nếu ta trừ mỗi phần tử của một dòng (hay cột) của ma trận C đi cùng một số α thì độ dài của tất cả các hành trình sẽ cùng giảm đi α ,vì thế hành SV: Nguyễn Thị Quỳnh Mai Lớp 07T1 TH Toán Rời Rạc  Trang 13 trình tối ưu cũng sẽ không thay đổi Vì vậy nếu ta tiến hành trừ bớt các phần tử của hàng và cột đi một hằng số sao cho thu được ma trận gồm các phần tử không âm mà trong mỗi hàng... Quỳnh Mai Lớp 07T1 TH Toán Rời Rạc  Trang 18 III BÀI 3: BÀI TOÁN TRÊN ĐỒ THỊ 1.Đề bài: Viết chương trình phát sinh ngẫu nhiên ma trận trọng số Anxn=(aij)nxn của đồ thị vô hướng liên thông G gồm n đỉnh (aij=aji ∀i,j=1 n) a) Kiểm tra đồ thị G có phải là đồ thị Euler hay không b) Nhập hai đỉnh x,y và dùng thuật toán Dijkstra để tìm đường đi ngắn nhất từ x đến y c) Dùng thuật toán Prim để tìm cây phủ... khoảng cách Cnxn=(cij)nxn Tìm hành trình ngắn nhất cho người du lịch 2.Thuật toán: 2.1 Bài toán lập lịch: Mỗi một chi tiết trong số n chi tiết D1, D2,…, Dn cần phải được lần lượt gia công trên 2 máy A, B Thời gian gia công chi tiết Di trên máy A là ai, trên máy B là bi (i=1 n) Lịch để gia công xong các chi tiết sớm nhất được trình bày theo thuật toán như sau: - Chia các chi tiết thành 2 nhóm: Nhóm N1 gồm... Nếu lớn hơn thì bỏ qua - Nếu nhỏ hơn thì cập nhật chi phí min mới, xoá bỏ hành trình cũ đã lưu và nạp hành trình mới - Nếu bằng thì cập nhật trường hợp và lưu thêm hành trình mới 3.Mã nguồn: SV: Nguyễn Thị Quỳnh Mai Lớp 07T1 TH Toán Rời Rạc  Trang 14 - Câu 1: #include #include #define MAX 50 int x[2][MAX]; int n; void Print() { int i; printf("Thoi gian gia cong chi tiet: \n");... (i,j) làm xuất hiện đường đi từ 2 đỉnh A đến B trong hành trình thì đường thẳng nối B đến A sẽ bị cấm ví dụ :A ->i >j >B thì cạnh (B,A) sẽ bị cấm ,việc cấm cạnh (B,A) được gọi là cấm hành trình con Phương án 2: cạnh (i,j) không thuộc hành trình tối ưu , vì vậy đường đi i >j sẽ bị cấm ,đây là phương án rẻ nhánh xa Chú thích: Việc cấm cạnh được thực hiện bằng cách gán cạnh cấm có chi phí bằng ∞ Trong... thì thuật toán kết thúc 3.Mã nguồn: #include #include #define vc 32767 #include #include #include int i, j, n, x, y; int c[20][20], tr[20], s[20], chuaxet[20]; void khoitao(); void inra1(); void euler(); void xtoy(); void cayphu(); void taomang(); void ngaunhien(); //====================// void main() { SV: Nguyễn Thị Quỳnh Mai Lớp 07T1 TH Toán Rời Rạc ... printf("Ko mo duoc file!"); getch(); } Print(); LapLich(); getch(); return 0; } Ma trận đầu vào: 5 3 4 6 5 3 3 2 7 6 3 - Câu 2: #include #include SV: Nguyễn Thị Quỳnh Mai Lớp 07T1 TH Toán Rời Rạc  Trang 16 #include int c[20][20], a[20], xopt[20], chuaxet[20], n, fopt, cmin, can; void nhapdulieu() { int i, j; printf("Nhap so thanh pho: "); scanf("%d", &n); printf("nhap ma tran... trinh toi uu co chi phi la :%5d \n\n", fopt); for (i = 1; i . TH Toán Rời Rạc  Trang 1 TRƯỜNG ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG KHOA CÔNG NGHỆ THÔNG TIN  BẢN BÁO CÁO THỰC HÀNH TOÁN RỜI RẠC Giáo viên hướng dẫn: Thầy Nguyễn. 07T1 TH Toán Rời Rạc  Trang 3 MỤC LỤC I. BÀI 1: BÀI TOÁN ĐẾM – BÀI TOÁN LIỆT KÊ 4 1.Đề bài: 4 2.Thuật toán: 4 3.Mã nguồn: 6 4.Demo: 10 II. BÀI 2:BÀI TOÁN TỐI ƯU RỜI RẠC 12 1.Đề bài: 12 2.Thuật toán: . Quỳnh Mai Lớp 07T1 TH Toán Rời Rạc  Trang 11 - Câu 2: - Câu 3: - Câu 4: SV: Nguyễn Thị Quỳnh Mai Lớp 07T1 TH Toán Rời Rạc  Trang 12 II. BÀI 2:BÀI TOÁN TỐI ƯU RỜI RẠC 1.Đề bài: 1. Viết chương

Ngày đăng: 06/08/2014, 14:22

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan