子集总和变化:找到总和大于等于目标的子集,且过冲最小

时间:2019-08-16 14:40:20

标签: algorithm dynamic-programming

给出一组正整数,目标总和为 k ,找到总和为 k 或至少超过 k 的子集。 (即相等或最小超调)

此问题发生在现实生活中的业务功能请求中,并且设置的大小通常在1到30之间。低端PC必须在3秒钟之内解决该问题,因此我估计暴力破解方法可能无法处理超过10个输入整数?

我已经查看了与子集总和和背包相关的搜索结果,但还没有人讨论过这个==变体。

1 个答案:

答案 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,我们将进行一些簿记并存储最佳结果。最后,我们检查是否存在一个完全匹配的值,如果不匹配,则返回较高的最佳值,否则返回一个准确的值。