线性算法找到最小子集和超过一个阈值
Linear algorithm to find minimum subset sum over a threshold
我有一个N个正整数的集合,每个正整数都以一个(相对较小的)常数c为界,我想找到这些数字的一个子集,其最小和大于(或等于)值k
所涉及的数字不是很大(<100),但即使在最坏的情况下,我也需要良好的性能。我想也许我可以把皮辛格的动态规划算法应用到这个任务中;它在0 (NC)时间内运行,而且我恰好满足有界正数的要求。
[Edit]:数字没有排序,可能有重复。
然而,我不太了解这个算法,不能自己做这个。事实上,我甚至不确定它所基于的假设是否仍然成立……
-是否有可能使这个算法适应我的需要?
-或者我可以使用另一种线性算法,同样有效?
-谁能提供伪代码或详细解释?
谢谢。
链接到我正在研究的子集和代码:用Pisinger
快速求解子集和算法(如果这是糟糕的措辞/格式/等道歉。我仍然是新的StackOverflow…)
Pisinger算法给出了小于或等于背包容量的最大和。要解决这个问题,可以使用Pisinger找出哪些不是应该放在子集中。正式地,设项目为w_1,…, w_n,最小值为k,给出w_1,…, w_n和w_1 +…+ w_n - K到Pisinger,然后取所有Pisinger没有的项
一个解决方案是:
T = {0}
for x in V
for t in T
T.insert(x+t)
for i in K to max(T)
if (T.contains(i))
return i
fail
这给出了子集的大小,但您可以调整输出成员。
T的最大大小为O(N)(因为有C界),所以运行时间为O(N^2),空间为O(N)。您可以使用长度为NC的位数组作为t的后备存储
相关文章:
- 传感器值的阈值
- 我们可以将阈值应用于色彩空间模型的单个组件(如 RGB 和 LAB)吗?
- 错误:断言失败 (src.type() == CV_8UC1) 在阈值中
- 使用阈值进行加速度计振动检测
- OpenCV Otsu的阈值:计算多个Mat对象的单个阈值
- 使用贝尔曼福特检测产品超过阈值的周期
- 为什么用于阈值矩阵元素的 Matlab 逻辑索引操作在性能上优于 mex 实现?
- 用于浮点阈值操作的 SIMD
- Java opencv inRange 阈值函数将我的图像分成三个不同的图像
- Unordered_map,检查滑动窗口中的阈值
- 一种无需使用if语句而无需使用阈值的方法
- 尝试在给定阈值下将所有像素更改为黑白
- 使用自动阈值进行分段
- 设置多部分上传阈值
- 在RGB图像上执行阈值操作
- Android -OpenCV模板与阈值匹配
- OPENCV3带有阈值函数的错误
- C++中的Max/Msp Past对象(超过阈值时增加一个值)
- 线性算法找到最小子集和超过一个阈值
- 用一个阈值比较两个二进制数组(近似匹配)