考虑以下问题:
有 N 个硬币,编号为 1 到 N。
你看不到它们,但会得到关于它们的 M 事实,形式如下:
struct Fact
{
set<int> positions
int num_heads
}
positions
标识硬币的一个子集,并且num_heads
是该子集中硬币正面的数量。
鉴于这些 M 事实,您需要计算出可能存在的最大正面数量。
这个问题是NP完全的吗?如果是,减少量是多少?如果不是,什么是多项式时间解?
例如:
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
与事实相匹配的头部最多的配置是:
T H H T H
所以答案是3个头。