给出数组形式的未排序整数集,找到所有可能的子集,它们的和大于k1且小于k2,其中k1,k2是两个浮点常量,例如:-我们的集合为{2,3, 5,8,10},而k1 = 10和k2 = 12。
可能的子集:-
{2,3,5}
{8,2}
{8,3}
{10}
{10,2}
我只能想到一个朴素的算法,是否有更好的方法或类似的问题,请给出一些建议。这实际上是我的项目工作的重要部分吗?有没有可用的动态编程方法?
答案 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解决方案。