动态规划问题

时间:2011-04-28 21:16:53

标签: c++ algorithm pseudocode

好吧,我真的不需要代码本身的帮助,但是要了解我为了编写代码而要做的确切内容。简而言之,我给了1000个项目,每个项目都有一组资源,我有一个(设置大量)资源来计算我能选择的最佳项目。

bestprofit函数的伪代码如下:

bestProfit:

Parameters - 
            projects: a vector of projects
            r:        the resources available to solve the subinstance 
            valueMap: the map data structure that is used for memoization
            n:        only projects numbered 0,...,n-1 may be 
                      used to solve the subinstance
Returns -   the maximum amount of profit that may be obtained on this
           subinstance of the optimization problem
Post-condition – If n > 0, then valueMap contains an entry 
                whose key is (r, n).

If n equals 0
     return 0
Check valueMap to see whether this subinstance has already been solved
-   If so, then return the previously computed result (function terminates)
best1 = bestProfit(projects, r, valueMap, n-1)
Check whether r provides enough resources to undertake project n-1
-   If so, then best2 = bestProfit(projects, r – projects[n-1].requirements, valueMap, n-1) 
+ projects[n-1].profit
 Else
     best2 = 0

If best1 >= best2
   Store (r, n) -> (best1, false) in valueMap
   Return best1
Else
   Store (r, n) -> (best2, true) in valueMap
   Return best2

当我对bestProfit进行递归调用时,best1应检查子问题是否已经解决。和best2,认为可行性检查仅基于最后一个项目。换句话说,它看起来像一棵平衡的树。 我无法理解的是如何在递归期间在地图上插入值?基本上,在遍历整个项目集之前,最终的if / else语句不会发生。并且只有最终值插入我的地图上。 我只是想要一些关于我应该如何处理它来正确编写递归的指针。

就像我之前所说的那样,我不是在寻找代码,而是在C ++中理解我的项目的伪代码的要求。正是这种逻辑在这一点上让我发疯,因为我不能把它放在一起工作。 感谢大家对此的看法,并在可能的情况下提供更好的见解。

2 个答案:

答案 0 :(得分:0)

我会返回一个数据结构,指示利润和获得该利润的解决方案。将精确数据结构存储在valueMap中。这将使您的代码更直接。

基本上,“编写正确的递归解决方案。添加记忆以使其快速。”

答案 1 :(得分:0)

你没有使用自下而上的解决方案吗?

这是背包问题的直接应用,其中有许多启发式方法适用于如果分数可能使其成为贪婪的解决方案......

对于您的问题,重现是     设W - >一些概念,通过它你可以定义你的资源是否足以满足要求     问题'k'     设N - >;由0指数索引的一组问题     设V - > 0基于解决每个问题的潜在利润指数     OPT [i] [j] = MAX(OPT [i-1] [j],OPT [i-1] [j-W [i]] + V [i])其中'i'是进入的索引     问题清单。 j是可用资源量的索引。     你的解决方案是OPT [size [N]] [W] 说明: 直觉上,子问题是在'i'中用可用资源'j'选择最佳项目集......

递归很糟糕,不允许使用普通函数调用进行许多编译器优化。