Hãy xem xét những vấn đề sau đây:Suy luận tập hợp NP-complete?
Có N đồng tiền đánh số từ 1 đến N.
Bạn không thể nhìn thấy chúng, nhưng được cho sự kiện M về chúng có dạng:
struct Fact
{
set<int> positions
int num_heads
}
positions
xác định một tập hợp con của các đồng tiền, và num_heads
là số lượng tiền trong tập con đó là đầu.
Với những sự kiện M này, bạn cần phải tính toán số lượng người đứng đầu tối đa có thể có.
Sự cố này có hoàn thành NP không? Nếu có, mức giảm là bao nhiêu? Nếu không, giải pháp thời gian đa thức là gì?
Ví dụ:
N = 5
M = 3
fact1 = { {1, 2}, 1 } // Either coin 1 or coin 2 is a head
fact2 = { {4}, 0 } // Coin 4 is a tail
fact3 = { {2, 4, 5}, 2 } // Out of coins 2, 4 and 5, two are heads
Một cấu hình với hầu hết người đứng đầu phù hợp với thực tế là:
T H H T H
Vì vậy, câu trả lời là 3 người đứng đầu.
Có lẽ tôi đã không suy nghĩ đủ lâu hoặc đủ cứng trên vấn đề của bạn được trình bày ở đây, nhưng bạn có chắc chắn - như là một điều đầu tiên - rằng vấn đề này thậm chí còn có thể giải quyết được? –
@ B.VB. Nó chắc chắn decidable: một thuật toán mũ đơn giản là liệt kê tất cả 2^N nhiệm vụ có thể và kiểm tra chúng chống lại các sự kiện M, theo dõi các giải pháp với hầu hết các thủ trưởng. Đây là thời gian O (N M 2^N). – Dougal
Nó có vẻ như có nên giảm với SAT, nhưng tôi không thể làm cho nó hoạt động được. Tuy nhiên, tôi chắc chắn là 80% trong NP. – Dougal