【问题标题】:Dynamic Programming Problem.. Array Partitioning..动态规划问题..数组分区..
【发布时间】:2011-09-23 12:02:00
【问题描述】:

问题说,

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

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

我在 url Dynamic Programming3 看到了类似的问题/解释

我在 pdf 中有以下查询:-

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

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

提前致谢..

【问题讨论】:

标签: c algorithm dynamic-programming bin-packing


【解决方案1】:

可以尝试递归处理:

给定一个 SORTED 数组 X={x1 ... xn} xi !=0 和一个整数 N。

首先找出仅用一个元素“制造”的所有可能性:

这里如果N=xp,消除所有的xi s.t i>=p

second找出两个元素的所有可能性:

{ (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 次比较

希望对你有帮助

【讨论】:

  • 这种方法的唯一问题是,对于一个更大的数组值,你什么时候停止尝试越来越多的数字?在您尝试制作的子集等于或大于剩余的值之前,您必须继续进行比较。当这些值稍后将在更大的集合中使用时,这也会一遍又一遍地对较小的集合进行大量比较。例如,如果您在一组 15 个整数中有等于 N 的数字,但小于该数字,它们不会创建一个集合,那么您将在 0 到 15 之间进行大量比较,直到找到一个有效的情况。
  • 对于较大的集合比较,您可以想象(我说想象是因为我不确定它是否有效),结合您对较小集合的结果并使用我在上面定义的“规则”。例如对于 6 个元素集:您查看 X2' 和 X4'(我用 2 和 4 个元素定义的 X')或 X1' 和 X5' 或 X3' 和 X3'。所以它减少了由小整数组成的集合的重复出现次数。
【解决方案2】:

不幸的是,这是一个非常困难的问题。甚至确定if there exists a single subset summing to your target valueNP-Complete

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

  • 子集必须是连续的吗?
  • 您可以忽略超过 K 个值的子集吗?
  • 数组值是否保证为正数?
  • 数组值是否保证是不同的?与其他值至少相差某个常数因子会怎样?
  • 最小值和最大值之间的差值是否有界限?

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2019-04-14
      • 1970-01-01
      • 2011-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-09
      相关资源
      最近更新 更多