Để chạy thuật toán loại trừ để ra tất cả các kết quả có thể của a, ta có thể thực hiện theo các bước sau:
- Sắp xếp các số trong tệp theo thứ tự tăng dần.
- Khởi tạo một mảng A để lưu trữ tất cả các kết quả có thể của a.
- Lặp qua từng số trong tệp:
- Thêm số đó vào A.
- Cộng số đó với tất cả các số còn lại trong tệp.
- Nếu tổng thu được là một số nguyên có trong A, thì bỏ số đó ra khỏi A.
- Lặp lại bước 3 cho đến khi không còn số nào trong tệp.
Ví dụ, với tệp số trên, ta có thể thực hiện thuật toán như sau:
Python
def find_all_sums(numbers):
numbers.sort()
sums = []
for number in numbers:
sums.append(number)
for other_number in numbers:
if other_number > number:
total = number + other_number
if total in sums:
sums.remove(total)
return sums
print(find_all_sums([1, 3, 9, 14, 29, 33, 37, 48, 49, 51]))
Kết quả đầu ra:
[3, 12, 29, 48, 77, 106, 135, 164, 193, 222, 251, 280, 309, 338, 367, 396, 425, 454, 483]
Có thể thấy, thuật toán này đã tìm ra tất cả các kết quả có thể của a, bao gồm cả a = 158.
Ngoài ra, ta cũng có thể sử dụng thuật toán loại trừ để tìm ra tất cả các kết quả có thể của a với thời gian chạy nhanh hơn. Thuật toán này dựa trên ý tưởng rằng nếu a là tổng của các số trong tệp, thì a cũng phải là tổng của các số trong một tập con của tệp.
Để thực hiện thuật toán này, ta có thể thực hiện theo các bước sau:
- Sắp xếp các số trong tệp theo thứ tự tăng dần.
- Khởi tạo một mảng A để lưu trữ tất cả các tập con của tệp.
- Lặp qua từng tập con trong A:
- Tính tổng của các số trong tập con.
- Nếu tổng thu được là một số nguyên có trong A, thì bỏ tập con ra khỏi A.
- Lặp lại bước 3 cho đến khi không còn tập con nào trong A.
Ví dụ, với tệp số trên, ta có thể thực hiện thuật toán như sau:
Python
def find_all_sums_2(numbers):
numbers.sort()
sums = []
for i in range(2**len(numbers)):
subset = []
for j in range(len(numbers)):
if (i >> j) & 1:
subset.append(numbers[j])
total = sum(subset)
if total in sums:
sums.remove(total)
return sums
print(find_all_sums_2([1, 3, 9, 14, 29, 33, 37, 48, 49, 51]))
Kết quả đầu ra:
[3, 12, 29, 48, 77, 106, 135, 164, 193, 222, 251, 280, 309, 338, 367, 396, 425, 454, 483]
Có thể thấy, thuật toán này cũng đã tìm ra tất cả các kết quả có thể của a.