Download as pdf or txt
Download as pdf or txt
You are on page 1of 1

ĐỀ KIỂM TRA GIỮA KỲ

HỌC PHẦN: PHÂN TÍCH THIẾT KẾ GIẢI THUẬT


THỜI GIAN: 90 PHÚT

Lưu ý khi nộp bài: câu 1 và câu 2, câu 3 phần mô tả cách làm, xây dựng công thức,
đánh giá thuật toán có thể viết tay trên giấy hoặc làm trên word, nhưng nộp file PDF.
Source code câu 2, 3 nộp (file .cpp).
Câu 1 (3,0 điểm): phân tích, đánh giá độ phức tạp thuật toán đoạn chương trình sau:
int i,j,k,n, sum=0;
for( int i = n; i > 0; i-- ) {
for( int j = 1; j < n; j *= 2 ) {
for( int k = 0; k < j; k++ ) {
sum += (i + j * k ); } } }
Câu 2 (3,0 điểm) Sử dụng chiến lược quay lui để viết chương trình cho bài toán
sau:
Cho một số nguyên dương n≤30, hãy tìm tất cả các cách phân tích số n thành tổng của
các số nguyên dương, các cách phân tích là hoán vị của nhau chỉ tính là 1 cách.
Yêu cầu:
a. Mô tả cách làm.
b. Phân tích, đánh giá độ phức tạp của thuật toán mà mình sử dụng.
c. Cài đặt
Input: 6
Output:
1+1+1+1+1+1 1+5
1+1+1+1+2 2+2+2
1+1+1+3 2+4
1+1+2+2 3+3
1+1+4 6
1+2+3

Câu 3 (4,0 điểm) Sử dụng chiến lược chia để trị, viết chương trình cho bài toán
sau:
Bạn được yêu cầu cắt dãy A=(a1, a2, .., an) thành K đoạn con. Trong một đoạn con, nếu
có một cặp số đứng sau nhỏ hơn số đứng trước (không nhất thiết phải đứng liền trước)
sẽ bị phạt 1 điểm. Hãy tìm phương án cắt có tổng số điểm phạt thấp nhất.
Ví dụ:
A=(20, 50, 30, 60, 40, 100) K=3
Cách chia: 20, 50 | 30, 60 | 40, 100 (số điểm phạt 0)
A=(20, 50, 30, 60, 40, tính là 1 a100, 5, 1) K=3
Cách chia: 20, 50, 30, 60 | 40, 100 | 5, 1 (số điểm phạt 2)
Yêu cầu:
a. Mô tả cách làm, xây dựng công thức.
b. Phân tích, đánh giá độ phức tạp của thuật toán mà mình sử dụng.
c. Cài đặt
----------------------------------------HẾT----------------------------------------------------------

You might also like