Tôi đã đọc về vấn đề tập hợp con-tiền khi tôi đã đưa ra những gì dường như là một thuật toán có mục đích chung để giải quyết nó:Vấn đề tập con-sum và khả năng giải được của NP-đầy đủ các vấn đề
(defun subset-contains-sum (set sum)
(let ((subsets) (new-subset) (new-sum))
(dolist (element set)
(dolist (subset-sum subsets)
(setf new-subset (cons element (car subset-sum)))
(setf new-sum (+ element (cdr subset-sum)))
(if (= new-sum sum)
(return-from subset-contains-sum new-subset))
(setf subsets (cons (cons new-subset new-sum) subsets)))
(setf subsets (cons (cons element element) subsets)))))
"set" là danh sách không chứa các từ khóa trùng lặp và "tổng hợp" là tổng để tìm kiếm các tập con. "tập hợp con" là danh sách các ô đối sánh trong đó "ô tô" là danh sách tập hợp con và "cdr" là tổng của tập hợp con đó. Các tập con mới được tạo từ các tập con cũ trong thời gian O (1) bằng cách chỉ cần gán phần tử cho mặt trước.
Tôi không chắc độ phức tạp của thời gian chạy là gì, nhưng xuất hiện với mỗi phần tử "tổng" tăng lên, kích thước của "tập hợp con" tăng gấp đôi, cộng thêm một, vì vậy nó xuất hiện với tôi ít nhất là bậc hai.
Tôi đăng bài này bởi vì ấn tượng của tôi trước đây là các vấn đề NP-complete có xu hướng khó hiểu và điều tốt nhất thường có thể hy vọng là một heuristic, nhưng điều này dường như là một giải pháp đa năng, giả sử bạn có chu kỳ CPU, luôn luôn cung cấp cho bạn câu trả lời đúng. Có bao nhiêu vấn đề NP-complete khác có thể được giải quyết như thế này?
Vâng, giải pháp của tôi về cơ bản là tìm kiếm toàn bộ tất cả các tập hợp con có thể có của "bộ" cho đến khi một tập hợp có tổng hợp đúng được tìm thấy, vì vậy tôi đoán rằng đó không phải là một thuật toán hiệu quả. –