Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 4

TRƯỜNG ĐẠI HỌC BÁCH KHOA

KHOA Công Nghệ Thông Tin


BỘ MÔN: Công Nghệ Phần Mềm
ĐỀ THI GIỮ KỲ HỌC PHẦN
Tên học phần: Toán rời rạc
Mã học phần: Hình thức thi: Tự luận có giám sát
Đề số: GK0001 Thời gian làm bài: 75 phút (không kể thời gian chép/phát đề)
Không được sử dụng tài liệu khi làm bài.

Họ tên:………………………………………Lớp………………MSSV:…………………

Sinh viên làm bài trực tiếp trên tệp này, lưu tệp với định dạng MSSV_HọTên.pdf và nộp bài
thông qua MSTeam:

Câu 1 (3 điểm) Cho n phần thưởng giống nhau chia đều cho k sinh viên
a) Hỏi có bao nhiêu cách chia.
# Trả lời: Dán lời giải vào bên dưới

b) Viết chương trình liệt kê phương án sao cho mỗi sinh viên nhận ít nhất 2 phần thưởng yêu ( k
va n thỏa mãn yêu cầu )

# Trả lời: Dán lời giải vào bên dưới


c) Viết chương trình nhập k và n và liệt kê tất cả các phương án(k<n)

# Trả lời: Dán code vào bên dưới

#include<stdio.h>

int n, k;
int x[1000];

void out() {
for(int i = 0; i < n; i++)
printf("%d ", x[i]);
printf("\n");
}

void Try(int i, int sum) {


if(i == n) {
if(sum == k)
out();
return;
}
for(int j = 1; j <= k; j++) {
x[i] = j;
Try(i + 1, sum + j);
}
}

int main() {
scanf("%d %d", &n, &k);
Try(0, 0);
}

Câu 2 ( 3 điểm) Gọi Bn là số chuỗi nhọ phân độ dài n, không chứa hai bit 1 liền nhau.
a) Lập hệ thức truy hồi để tính Bn.
# Trả lời: Dán lời giải vào bên dưới
b) Giải hệ thức truy hồi trên câu a).
# Trả lời: Dán lời giải vào bên dưới

c) Viết hàm tính Bn sử dụng phương pháp đệ quỵ.


# Trả lời: Dán code vào bên dưới

float tinh(int n){


if(n < 1 ) return 0;
if(n == 1) return 2;
if(n == 2) return 3;
else return tinh(n-1)+tinh(n-2);
}

Câu 3 ( 4 điểm) Cho tập X = {1, 2, …, n }, n∈ Z ,n ≥ 1.


a) Trình bày phương pháp sinh
# Trả lời: Dán sơ đồ khối hoặc ngôn ngữ tự nhiên vào bên dưới

-Xác định trạng thái ban đầu của bài toán


-Xác định trạng thái kết thúc
-Xác định 1 thứ tự cho các trạng thái
-Tìm giải thuật đi từ trạng thái này sang trạng thái khác

b) Viết chương trình liệt kê hoán vị tập X bằng phương pháp sinh
# Trả lời: Dán code vào bên dưới
#include<stdio.h>
void out(int s[], int n);
void Try(int i, int s[], int b[], int n);
int d=0;
int main(){
int n;
printf("nhap n=");
scanf("%d",&n);
int b[n+1], s[n+1];
for ( int j=1; j<=n; j++){
b[j]=1;
}
Try(1,s,b,n);
return 0;
}
void out(int s[], int n){
printf("%d: ", ++d);
for (int i=1; i<=n; i++){
printf("%d ", s[i]);
}
printf("\n");
}
void Try(int i, int s[], int b[], int n){
for (int j=1; j<=n; j++){
if(b[j]==1){
s[i]=j;
b[j]=0;
if(i==n){
out(s,n);
}
else Try(i+1,s,b,n);
b[j]=1;
}
}
}

Tổng cộng có: 3 câu


Đà Nẵng, ngày 11 tháng 04 năm 2023
GIẢNG VIÊN BIÊN SOẠN ĐỀ THI TRƯỞNG BỘ MÔN

You might also like