Algorithm 子集和变量:查找求和到>;=目标,超调量最小

Algorithm 子集和变量:查找求和到>;=目标,超调量最小,algorithm,dynamic-programming,Algorithm,Dynamic Programming,给定一组正整数和一个目标和k,查找和正好k或至少超过k的子集。(即相等或最小超调量) 这个问题发生在实际的业务功能请求中,设置的大小通常在1到30之间。它必须在3秒内由低端PC解决,所以我猜bruteforce方法可能无法处理10个以上的输入整数 我已经查看了与子集和背包相关的搜索命中率,但还没有看到任何人讨论这个>=变化。这是原始程序的一个相当简单的扩展:我们只使用动态规划算法,但也存储生成的列表,如果这些列表超出原始值 例如,我们可以实现如下算法: def least_gt_subset_s

给定一组正整数和一个目标和k,查找和正好k或至少超过k的子集。(即相等或最小超调量)

这个问题发生在实际的业务功能请求中,设置的大小通常在1到30之间。它必须在3秒内由低端PC解决,所以我猜bruteforce方法可能无法处理10个以上的输入整数


我已经查看了与子集和背包相关的搜索命中率,但还没有看到任何人讨论这个>=变化。

这是原始程序的一个相当简单的扩展:我们只使用动态规划算法,但也存储生成的列表,如果这些列表超出原始值

例如,我们可以实现如下算法:

def least_gt_subset_sum(items, k):
    vals = [None]*(k+1)
    vals[0] = ()
    best_v = None
    best_k = 0
    for item in items:
        for i in range(k-1, -1, -1):
            if vals[i] is not None:
                if i + item <= k and vals[i+item] is None:
                    vals[i+item] = (*vals[i], item)
                if i + item > k and (best_v is None or i + item < best_v):
                    best_v = i + item
                    best_k = (*vals[i], item)
    if vals[k] is not None:
        return vals[k]
    else:
        return best_k
def最小子集和(项,k):
VAL=[无]*(k+1)
VAL[0]=()
最佳值=无
最佳k=0
对于项目中的项目:
对于范围(k-1,-1,-1)内的i:
如果VAL[i]不是无:
如果i+项目k和(最佳值v为无或i+项目<最佳值v):
最佳_v=i+项
最佳k=(*VAL[i],项目)
如果VAL[k]不是无:
返回VAL[k]
其他:
返回最佳值_k

因此,这里我们使用相同的技巧,但如果值高于
k
,我们会做一些簿记,并存储最佳结果。最后,我们查看是否有完全匹配的值,如果没有,我们将返回较高的最佳集,否则将返回精确的值。

如果您了解动态规划方法的工作原理,实现这种变化相当容易。例如,请参阅关于最近子集的答案。是的,上面提到过冲和欠冲都可以接受,但是想法是一样的。