问题是,
给定一个大小为n的数组,我们必须将数组输出/分区为总和为N的子集。
For E,g,
I/p arr{2,4,5,7}, n=4, N(sum) = 7(given)
O/p = {2,5}, {7}
中看到了类似的问题/解释
我在pdf中有以下查询: -
- 我们怎么能找到总和为N的子集,因为逻辑只告诉子集是否存在?
- 另外,如果我们稍微改变一下这个问题,我们能否找到两个使用相同意识形态具有相同平均值的子集?
醇>
任何人都可以对这个动态编程问题有所了解.. :)
先谢谢..
答案 0 :(得分:1)
您可以尝试递归处理:
给定一个SORTED数组X = {x1 ... xn} xi!= 0和一个整数N.
首先只用一个元素找到“制作”的所有可能性:
这里如果N = xp,则消除所有xi s.t i> = p
第二次查找使用2个元素进行的所有可能性:
{(x1,x2)....(xp-2,xp-1)}
按总和排序并消除所有总和> = N. 你有规则:当xi + xj> = N
时,xi不能用xj第三,包含3个元素: 您创建了尊重上述规则的所有部分。 并且同意第2步 等...
示例:强>
X={1,2,4,7,9,10} N=9
step one:
{9}
X'={1,2,4,7,9}
step 2: cannot chose 9 and 10
X={(1,2) (1,4) (2,4) (1,7) (2,7) (4,7)}
{2,7}
X'={(1,2) (1,4) (2,4) (1,7)}
step 3: 4 and 2 cannot go with 7:
X={(1,2,4)}
no sol
{9} {2,7} are the only solutions
这会减少你只做的比较总数(即2 ^ n = 2 ^ 6 = 64):12个比较
希望有所帮助
答案 1 :(得分:1)
不幸的是,这是一个非常棘手的问题。即使确定if there exists a single subset summing to your target value也是NP-Complete。
如果问题受到更多限制,您可能会找到一个好的算法。例如:
答案 2 :(得分:0)
所提出的算法仅在临时数组T[N]
中存储一位信息,即它是否可以到达。显然,您可以在每个索引[N]
上存储更多信息,例如用于实现目标的值C[i]
。 (这是PDF中“处理无限制副本”一章的变体