这个问题是NP难问题,因为有效地解决它将会有效地解决子集和问题。考虑到这一点,除非你相信P=NP,否则你不可能找到一个有效的算法来解决它。你总是可以想出一些启发式方法来指导你的搜索,但在最坏的情况下,你将不得不检查每个包含m个整数的子集。
如果“好”意味着“正确”,那么就尝试每一种可能性,这将花费你约 n 选择 m 的时间。非常缓慢。不幸的是,这通常是你在一般情况下所能做到的最好的,因为对于任何一组整数,你总可以添加一个更多的整数,它是另外 m-1 个整数的负数之和——并且这些其他整数都可以具有相同的符号,所以你无法搜索。如果“好”意味着“快速且通常正常工作”,则有各种方法可供选择,例如:假设你可以解决 m=2 的问题,并进一步假设你可以同时解决正负两个答案(然后取其中较小的一个)。现在假设你想解决 m=4。先解决 m=2,然后排除这两个数字并再次求解...接下来该怎么做显而易见!现在,m=6 呢?现在假设你可以解决 m=3 和 m=2 的问题。你认为你可以得到 m=5 的一个不错的答案吗?最后请注意,如果你将数字排序,你可以一次通过解决 m=2 来解决问题,并且对于 m=3,你需要进行一个令人讨厌的二次搜索,但至少你可以只对大约四分之一的列表进行两次操作(正数和负数的小一半)并寻找相反符号的数字来抵消。