给定一组n个整数,列出所有可能的子集,其中k1 <= sum <= k2,k1和k2浮点数

时间:2018-06-22 07:04:25

标签: algorithm dynamic-programming subset-sum

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

可能的子集:-

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

我只能想到一个朴素的算法,是否有更好的方法或类似的问题,请给出一些建议。这实际上是我的项目工作的重要部分吗?有没有可用的动态编程方法?

3 个答案:

答案 0 :(得分:0)

是的,确实存在动态编程方法。
制作长度为k2 + 1的表格(列表数组)并填写:
对于V=A[i]从头到尾扫描的每个数组,如果V不为空,则将j-th添加到Table[j - V]单元格中的列表中(因此我们可以将值{ {1}}将j添加到V的所有子集中)
最后,检查具有所需总和的单元格并还原序列。

2,3,5的示例:

Table[j - V]

要检索总和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 表示我们转到3,然后使用5-3=2直到输入零。第二个变体-使用2,我们进入零入口。因此,值5可能来自集合5或集合{5}

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

答案 1 :(得分:0)

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

由于该集合包含所有整数,因此您只需将K1和K2转换为整数,然后检查属于给定范围的子集即可。

DP [N] [sum_of_all_elements];

现在,您有一个元素说DP [N-1] [x],即K1 <= x <= K2。

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

答案 2 :(得分:0)

将此问题减少到F(k1,k2) = F'(k1)+F'(k1+1)+...+F'(K2)

然后F'(k)是一个简单的DP解决方案。