给出一组正整数,目标总和为 k ,找到总和为 k 或至少超过 k 的子集。 (即相等或最小超调)
此问题发生在现实生活中的业务功能请求中,并且设置的大小通常在1到30之间。低端PC必须在3秒钟之内解决该问题,因此我估计暴力破解方法可能无法处理超过10个输入整数?
我已经查看了与子集总和和背包相关的搜索结果,但还没有人讨论过这个==变体。
答案 0 :(得分:1)
这是原始程序的一个相当简单的扩展:我们只使用动态编程算法,但是还会存储我们生成的列表(如果这些列表超出了原始值)。
例如,我们可以实现以下算法:
int Naslov_rnd;
TextBox tb; // Declare it here
private void Naslov_p_Click(object sender, EventArgs e)
{
tb = new TextBox();
// ...
}
protected void tb_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
tb.Left = e.X + tb.Left;
tb.Top = e.Y + tb.Top;
}
}
protected void tb_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
Point MouseDownLocation = e.Location;
}
}
因此,在这里我们使用相同的技巧,但是如果值大于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
,我们将进行一些簿记并存储最佳结果。最后,我们检查是否存在一个完全匹配的值,如果不匹配,则返回较高的最佳值,否则返回一个准确的值。