Thuật toán sinh kế tiếp – 3.Bài toán liệt kê các tập con m phần tử của tập n phần tử

Thuật toán sinh kế tiếp

Bài toán liệt kê các tập con m phần tử của tập n phần tử

Bài toán: Cho một tập hợp X = {1, 2, 3, …, n – 1,  n}. Hãy liệt kê tất cả các tập con m < n phần tử của X.

Xét bài toán ví dụ: Cho tập A = {1, 2, 3, 4, 5} , hãy liệt kê các tập con có 3 phần tử của A.

Ta sẽ liệt kê được các tập con như bảng sau. Hãy xem bảng và tìm quy luật của nó.

STT

     

1

1 2 3

2

1 2 4
3 1 2

5

4 1 3

4

5

1 3 5
6 1 4

5

7

2 3 4

8

2 3

5

9 2 4

3

10 3 4

5

*          Quy luật của dãy đó là:

– Tìm tử bên phải dãy a1, a2,  a3, …, am phần tử ai ≠ n  – m + i.

– Thay thế ai = ai + 1.

– Thay aj  = ai + j – i, với j = i + 1, i + 2, …, m.

*          Phân tích ví dụ: (Xét từ  a0 , …, am-1)

– Ở hàng thứ 1 -> 2 ta thấy a2 (= 3) ≠  n  – m + i ( = 5 – 3 + 2 = 4).

Vì vậy thay thế ai = ai + 1 = 3 + 1 = 4.

-Tương tự ở hàng thứ 2 -> 3 cũng giống 1 -> 2.

– Ở hàng 3 -> 4, ta thấy ở a2 (= 4) = n  – m + i ( = 5 – 3 + 2 = 4) vậy xét đến a1 = 2 ) ≠  n  – m + i ( = 5 – 3 + 1 = 3). Vậy thay thế a1  = a1 + 1 = 3.

Vì bên phải ai còn có các phần tử aj khác với j = i + 1, i + 2, …, m. Ta thấy ở đây chỉ còn mỗi một phần tử  ứng với j  = 2, thay aj  = ai + j – i (= 3 + 2 – 1 = 4).

– Các hàng khác quy luật tương tự.

– Ta có số tập con được tạo ra là  5C3 = 10.

–>Cài  đặt chương trình ( sử dụng C ++)

Untitled

Leave a comment