【问题标题】:Problems with dynamic programming动态规划的问题
【发布时间】:2012-04-09 08:51:56
【问题描述】:

我在理解动态编程方面遇到了困难,所以我决定解决一些问题。我知道基本的动态算法,如最长公共子序列、背包问题,但我知道它们是因为我读过它们,但我自己无法想出一些东西:-(

例如,我们有自然数的子序列。我们可以用加号或减号取的每个数字。最后我们取这个总和的绝对值。对于每个子序列,找到可能的最低结果。

in1: 10 3 5 4; 输出1:2

in2: 4 11 5 5 5; 输出2:0

in3: 10 50 60 65 90 100; 输出3:5

第 3 次的解释:5 = |10+50+60+65-90-100|

更糟糕的是我的朋友告诉我这是简单的背包问题,但我在这里看不到任何背包。动态编程是不是很困难,还是只有我有大问题?

【问题讨论】:

    标签: algorithm dynamic-programming knapsack-problem partition-problem


    【解决方案1】:

    这与 Tug Of War 中的问题相同,但没有平衡团队规模的限制(不相关): http://acm.uva.es/p/v100/10032.html

    我用自上而下的方法解决了这个问题。它适用于给定数字有上限的约束。你有上限还是数量不受限制?如果它们不受约束,我看不出如何使用动态编程来解决这个问题。

    【讨论】:

    • 您能否澄清一下自上而下的方法是什么?数字小于 10000 且数字小于 5000
    • 我认为 Óscar López 发布的解决方案比我的更优雅。
    【解决方案2】:

    这里的背包是每个元素的weight = value = number

    您绑定的W1/2 * sum(elements)

    这个想法是 - 您希望在不超过 1/2 * sum(elements) 的限制的情况下最大化您“选择”的数字数量,这与 value=weight 完全一样。

    这个问题其实是partition problem,是subset sum problem的特例。

    分区问题说:“是否有可能得到一个总和为一半的元素子集?”
    从这里推导你的问题很简单——如果有,把它们当作+,你没有把它们当作-,你得到out = 0。 [反之亦然]。因此,您描述的问题是分区问题的优化。

    【讨论】:

      【解决方案3】:

      正如amit所指出的,这个算法可以理解为partition problem的一个实例。对于一个简单的实现,看看这个 Python 代码:

      def partition(A):
          n = len(A)
          if n == 0:
              return 0
          k, s = max(A), sum(A)/2.0
          table = [0 if x else 1 for x in xrange(n*k)]
          for i in xrange(n):
              for j in xrange(n*k-1, -1, -1):
                  if table[j-A[i]] > table[j]:
                      table[j] = 1
          minVal, minIdx = float('+inf'), -1
          for j in xrange(int(s)+1):
              if table[j] and s-j < minVal:
                  minVal, minIdx = s-j, j
          return int(2*minVal)
      

      当使用问题中的输入之一调用时:

      partition([10, 50, 60, 65, 90, 100])
      

      正如预期的那样,它将返回5。要全面了解解决方案背后的数学原理,请查看此examples 并单击“平衡分区”链接。

      【讨论】:

        猜你喜欢
        • 2011-10-17
        • 2011-10-14
        • 1970-01-01
        • 1970-01-01
        • 2021-02-25
        • 2020-12-13
        • 2023-04-03
        相关资源
        最近更新 更多