在课堂上,我们讨论了子集和问题的解决方案(给定一组S为正数,是否存在S的子集总和为正值T)。这是我用简单的测试用例实现的算法的python实现:
def ss(s, i, t):
if t == 0:
return True
if i == (len(s)-1):
return s[i] == t
return ss(s, i+1, t-s[i]) or ss(s, i+1, t)
s = [1, 3, 5]
t = 8
print(ss(s, 0, t))
>> True
我们应该为可以处理S和T中的负值的修改算法做出并证明其正确性。但是,似乎到目前为止,我在未经修改的算法上尝试过的每个带有负值的集合都仍然可以使用。我似乎找不到一个示例,说明该算法对负值失败。
有人可以向我解释为什么该算法不适用于所有负值,并可能给出一个反例来证明这一点吗?
答案 0 :(得分:1)
这确实适用于负数。如前所述,也许是要证明算法在不同的前置条件和后置条件下的正确性吗?取决于您如何证明其正确性。
请注意,这在Python中有效,因为该语言没有明确的“自然数”限制。如果您使用的是伪代码或更严格的编程语言,则这些限制会更有意义。希望对您有所帮助。