【问题标题】:Given a set of n integers, list all possible subsets with k1<= sum <=k2 , k1 and k2 floating numbers给定一组 n 个整数,列出所有可能的子集,其中 k1<= sum <=k2 , k1 和 k2 浮点数
【发布时间】:2018-06-22 07:04:24
【问题描述】:

给定一个未排序的数组形式的整数集合,找到所有可能的子集,其总和大于 k1 且小于 k2 ,其中 k1 ,k2 是两个浮动常量,例如:- 我们的集合是 {2,3, 5,8,10} 和 k1 =10 和 k2 = 12。

可能的子集:-

{2,3,5}
{8,2}
{8,3}
{10}
{10,2}

我只能想到一个幼稚的算法,有没有更好的方法或类似的问题,请给一些建议。它实际上是我项目工作的重要组成部分?有没有可用的动态规划方法?

【问题讨论】:

    标签: algorithm dynamic-programming subset-sum


    【解决方案1】:

    是的,动态规划方法确实存在。
    制作长度为 k2+1 的表格(列表数组)并填充它:
    对于每个值V=A[i]从末尾扫描数组,并将V添加到j-th单元格的列表中,如果Table[j - V]不为空(因此我们可以组合值jV添加到所有来自Table[j - V])
    最后检查具有所需总和的单元格并恢复序列。

    2,3,5 的示例:

     0    1    2   3   4   5   6   7   8   9   10    //index
     [0]                                             //initial state
     [0]      [2]                                    //after 2   
     [0]      [2]  [3]    [3]                        //after 3     
     [0]      [2]  [3]    [3,5]   [5] [5]      [5]   //after 5
    

    要检索总和 5 的集合 - 到达第五个单元格并将值展开到左侧。 3 表示我们转到5-3=2,然后使用2 直到零条目。第二种变体 - 使用5,我们进入零条目。所以值 5 可能是从集合 {5} 或从集合 {3,2} 产生的

    请注意,存储序列数据可能需要大量空间,而恢复序列可能需要最多 2^N 时间 - 当有很多好的子集时。

    【讨论】:

    • 谢谢。你能举个例子吗?这有点令人困惑。
    • 我写了一个简短的例子
    【解决方案2】:

    是的,它实际上可以通过以下方式解决: subset sum problem

    由于该集合包含所有整数,因此您只需键入 cast K1 和 K2 为整数,然后检查哪些是给定范围内的子集。

    DP[N][sum_of_all_elements];

    现在你得到了你的集合中的一个元素,比如 DP[N-1][x],即K1

    现在您需要在 DP[][] 数组中向上移动以查找集合中的下一个元素,依此类推。您需要对每个具有 value(K1

    【讨论】:

    • 谢谢,听起来很有趣,但从措辞上很难理解,你能举个例子吗。
    【解决方案3】:

    将此问题简化为F(k1,k2) = F'(k1)+F'(k1+1)+...+F'(K2)

    那么 F'(k) 是一个简单的 DP 解。

    【讨论】:

    猜你喜欢
    • 2012-02-03
    • 2021-12-21
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    • 2018-10-15
    相关资源
    最近更新 更多