动态编程算法两者之间的最短路径

时间:2014-07-03 16:13:11

标签: dynamic-programming

目前有一种算法让我发疯。

我已经看过它的不少变种,所以我只是试着解释一下我能想到的最简单的一种。

我们说我有一个项目P:

项目P由4个子项目组成。

我可以通过两种不同的方式解决这四种模式中的每一种,并且每种模式都有特定的成本和特定的时间要求:

例如(补偿):

P:               1    +    2      +    3     +    4  + .... n

A(T/C)          Ta1/Ca1     Ta2/Ca2  etc      

B(T/C)          Tb1/Cb1 etc

基本上我必须找到成本最低的四种模式的组合。这很容易,问题是:组合必须低于特定的给定时间。

为了找到最低的组合,我可以轻松地写出类似的内容:

for i = 1 to n
    aa[i] = min(aa[i-1],ba[i-1]) + value(a[i])
    bb[i] = min(bb[i-1],ab[i-1]) + value(b[i])
    ba[i] = min(bb[i-1],ab[i-1]) + value(b[i])
    ab[i] = min(aa[i-1],ba[i-1]) + value(a[i])

现在类似的东西非常简单并且每次都返回正确的值,最后一个圆圈的最低值将是正确的值。

问题是:如果min返回最后一次采用的模态,那么无论成本如何,我都会拥有最快的程序。

如果min返回最低成本,那么无论花费多少时间实现它,我都会拥有最便宜的项目。

然而,我需要考虑两个:我可以使用O(2 ^ n)的递归函数轻松完成,但我似乎无法找到动态编程的解决方案。

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

如果真的只有四个项目,那么你应该采用指数时间解决方案。只有16种不同的情况,代码简短,易于验证!

无论如何,我很确定你描述的问题是knapsack problem,这是NP难的。因此,除非P = NP,否则不存在亚指数的精确解。但是,根据实际上是什么“n”(在你的情况下它是4?还是时间和成本的值?),可能存在伪多项式时间解。维基百科文章包含对这些内容的描述。