动态规划问题..数组分区..

时间:2011-06-27 12:53:14

标签: c algorithm dynamic-programming bin-packing

问题是,

给定一个大小为n的数组,我们必须将数组输出/分区为总和为N的子集。

For E,g, 
    I/p  arr{2,4,5,7}, n=4, N(sum) = 7(given)
    O/p = {2,5}, {7}

我在网址Dynamic Programming3

中看到了类似的问题/解释

我在pdf中有以下查询: -

  
    
        
  1. 我们怎么能找到总和为N的子集,因为逻辑只告诉子集是否存在?
  2.     
  3. 另外,如果我们稍微改变一下这个问题,我们能否找到两个使用相同意识形态具有相同平均值的子集?
  4.        

任何人都可以对这个动态编程问题有所了解.. :)

先谢谢..

3 个答案:

答案 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

如果问题受到更多限制,您可能会找到一个好的算法。例如:

  • 子集必须是连续的吗?
  • 您可以忽略超过K值的子集吗?
  • 数组值是否保证为正?
  • 数组值是否保证不同?那么至少与某些常数因子不同,与其他值有何不同?
  • 最小值和最大值之间的差异是否存在约束?

答案 2 :(得分:0)

所提出的算法仅在临时数组T[N]中存储一位信息,即它是否可以到达。显然,您可以在每个索引[N]上存储更多信息,例如用于实现目标的值C[i]。 (这是PDF中“处理无限制副本”一章的变体