我不明白如何将这个分区问题视为动态编程问题。
我有以下疑问:
1)这不是优化问题(或者我看不到),那么为什么我们要对它应用DP方法?
2)DP问题满足2个属性:
最佳子结构
但是我看不到满足上述属性的问题。
分区问题是确定给定集合是否可以划分为两个子集,以使两个子集中的元素之和相同。
arr [] = {1、5、11、5}
输出:true
可以将数组划分为{1、5、5}和{11}
arr [] = {1,5,3}
输出:false
不能将数组划分为相等的总和集。
答案 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 足够小,则可以使用动态编程解决该问题。