Ta sử dụng định nghĩa dãy Fibonacci như sau: $F_1 = 1; F_2 = 2; F_{n} = F_{n-1}+F_{n-2} \, \forall n \ge 3$.
Câu 1: Chứng minh rằng mọi số nguyên dương $N \ge 1$ luôn có thể phân tích tổng của một số hữu hạn số Fibonacci $F_n$ phân biệt.
Câu 2: Gọi $L^*(N)$ là độ dài của cách phân tích $N$ thành tổng các số Fibonacci phân biệt sao cho số số hạng là nhiều nhất. Một cậu học trò không biết làm sao để tìm $L^*(N)$, nên cậu đề xuất một thuật toán $H$ như sau:
- Gọi $m_N$ là số nguyên dương nhỏ nhất sao cho $S_N = \sum\limits_{n=1}^{m_N} F_n \ge N$
- Nếu $S_N$ thì $L^*(N) = m_N$, tức là $S_N$ là cách phân tích cần tìm.
- Nếu $S_N > N$ thì đặt $d_N = S_N - N$
- Phân tích $d_N$ thành tổng các số Fibonacci phân biệt sử dụng thuật toán $H'$
- Loại bỏ những số Fibonacci nào trong $S_N$ nào xuất hiện trong $d_N$, thu được $S'_N$. Khi đó, $S'_N$ là kết quả của thuật toán.
Thuật toán $H'$: phân tích một số nguyên dương $N$ thành tổng các số Fibonacci phân biệt theo nguyên tắc tham lam giảm dần (decreasing greedy):
- Gọi $i$ là chỉ số lớn nhất sao cho $F_i \le N$.
- Đặt $N'=N-F_i$.
- Nếu $N'=0$ thì dừng.
- Nếu $N'>0$ thì thay $N$ bởi $N'$, và quay lại bước 1.
Các chỉ số $i$ tìm được sẽ cho ta cách phân tích $N$ thành ít số Fibonacci nhất có thể.
a. CMR thuật toán $H'$ sẽ tìm ra phân tích Fibonacci ngắn nhất có thể
b. CM tính đúng đắn của thuật toán $H$, tức là $H$ sẽ cho ra một phân tích Fibonacci, dù cho có thể không phải là phân tích tối ưu.
c. Ta muốn đánh giá hiệu suất của $H$. Gọi $L^H(N)$ là độ dài của cách phân tích bởi thuật toán $H$. Tìm $a,b$ tốt nhất sao cho \[\mathop {\lim }\limits_{N \to \infty } \left( {\frac{{{L^H}\left( N \right)}}{{{L^*}\left( N \right)}} - \left( {aN + b} \right)} \right) = 0\]
Bài viết đã được chỉnh sửa nội dung bởi perfectstrong: 03-01-2025 - 03:57
Giải thích cụ thể câu 2a