目前有一种算法让我发疯。
我已经看过它的不少变种,所以我只是试着解释一下我能想到的最简单的一种。
我们说我有一个项目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)的递归函数轻松完成,但我似乎无法找到动态编程的解决方案。
任何人都可以帮助我吗?
答案 0 :(得分:0)
如果真的只有四个项目,那么你应该采用指数时间解决方案。只有16种不同的情况,代码简短,易于验证!
无论如何,我很确定你描述的问题是knapsack problem,这是NP难的。因此,除非P = NP,否则不存在亚指数的精确解。但是,根据实际上是什么“n”(在你的情况下它是4?还是时间和成本的值?),可能存在伪多项式时间解。维基百科文章包含对这些内容的描述。