假设您有一组不同的数字{5,6,1,67,13,9,14,15},以及这样的要求列表: R1:你必须从set(5,6,10)中选择至少2个数字,这些数字也在你的数组中,在这种情况下它将是5,6
R2:您必须从set(9,13,67,5)中选择至少3个数字,这些数字也在您的数组中。在这种情况下,它将是9,13,67。请注意,我们无法选择5,因为它已在R1中使用
R3:您必须从set(1,14,15,6)中选择至少2个数字,这些数字也在您的数组中。在这种情况下,它可以是1,14或1,15或14,15我们将有多个满意度。 .....
.....
Rk:你必须从你的阵列中的set(.......)中至少找到k个数字。
所以问题是找到一个多项式时间算法来确定给定的数组是否符合所有要求,并且数组的每个数字只能用于满足一个要求。
我的解决方案是这样的:
determine(array a,R[]) //R[] is a array of requirements, array a is our checking array
{
if R is empty return true //we satisfied all the requirments
if R[0] cannot be satisfied by our array a return false
for each satisfactions
{
new array b=a-selected numbers for this satisfaction
new rule array newR=R-R[0] //remove the first rule of the rule array
if determine(b,newR) is false //we begin our recursive call
we continue our loop since this means the current way of satisfaction does not work
else return true
}
return false //this means we finish checking all the satisfactions and cannot find a match we need to tell the last recursive call that this way does not work
}
显然我的解决方案需要指数时间,任何人都可以提出多项式解决方案吗?
答案 0 :(得分:1)
在满足所有要求后,您将选择数组中的每个元素(c(0),c(1),c(2),...,c(n))次。
其中c(i)为0或1.例如,你的约束告诉你c(i)+ c(j)+ c(k)= 2。
我可能错了,但这似乎是0-1整数编程,这是卡普的NP完全问题之一,不是吗?
http://en.wikipedia.org/wiki/Integer_linear_programming#Integer_unknowns