如何将分区问题建模为动态编程问题?

时间:2019-05-18 13:55:58

标签: c++11 dynamic-programming

我不明白如何将这个分区问题视为动态编程问题。

我有以下疑问:

1)这不是优化问题(或者我看不到),那么为什么我们要对它应用DP方法?

2)DP问题满足2个属性:

  1. 重叠子问题
  2. 最佳子结构

    但是我看不到满足上述属性的问题。

分区问题是确定给定集合是否可以划分为两个子集,以使两个子集中的元素之和相同。

arr [] = {1、5、11、5}

输出:true

可以将数组划分为{1、5、5}和{11}

arr [] = {1,5,3}

输出:false

不能将数组划分为相等的总和集。

1 个答案:

答案 0 :(得分:0)

问题是NP-Complete,但对于较小的约束,可以使用动态编程解决。

重复关系如下:

f(index,sum)= f(index,sum + arr [index])或f(index + 1,sum-arr [index])

,对于基本情况:

if(index >= arraySize) {
    if ( sum == 0 ) 
        return true;
    else
       return false;

}

此函数的时间复杂度和内存复杂度将 O(arraySize * maximumSum)。因此,如果 arraySize * maximumSum 足够小,则可以使用动态编程解决该问题。