一道算法题求教
在效率尽可能高的情况下解答:
在给定一个由n个整数构成的集合S和另一个整数x时,判断出S中是否存在有任意个其和等于x的元素?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
在效率尽可能高的情况下解答:
在给定一个由n个整数构成的集合S和另一个整数x时,判断出S中是否存在有任意个其和等于x的元素?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(3)
通过维基百科和stackoverflow 知道这是subset problem
采用动态规划进行求解:
1. 设集合x的最小和以及最大和分别是min,max,设一个二维数组 m[n][max-min]
m[i][s] = 1表示找到了x[1...i]的一个子集和等于s
因此初试条件:m[1][x1] = 1
递推关系:
m[2][x] = 1 if m[1][x-x2] = 1, 否则 m[2][x] = m[1][x]
任意个其和?应该说有多少种方案吧!典型组合数学,去翻翻书就知道了.
这个题目是01背包的变种吧,楼主可以先去学习下01背包。事实上我们可以这么做我们设布尔变量fi为1~i个数中是否存在和为x的任意元素,那么我们可以得到递推表达式
f[i][j] = (f[i - 1][j - arr[i]] | f[i - 1][j]);
其中f[i - 1][j - arr[i]]
意思是选这个元素可不可能实现。f[i - 1][j]
的意思就是不选这个元素可不可以实现。所以最后我们可以得到这样的一个程序:最后时间复杂度 O(n * x)
当然如果你看懂上面的步骤的话那么你还可以对空间复杂度进行优化,优化原理如果感兴趣可以私信我或自己研究。
代码如下:
这样空间复杂度就变为了 O(x)。
以上。