动态规划的递推方程

时间:2012-11-21 15:46:36

标签: dynamic-programming

我的情况与背包问题非常相似,但我只想确认我的递归方程与背包问题相同。

我们最多投资M美元。我们有N个不同的投资,每个投资都有成本m(i)和利润g(i)。我们希望找到最大化利润的递推方程。

这是我的回答:

     g(i,j) = max{g(i-1,j), g_i + (i-1,j-m_i)}      if j-m_i >= 0

              g(i-1,j)                              if j-m_i < 0

我希望我的解释清楚。

谢谢你,祝你有愉快的一天!

巴比

1 个答案:

答案 0 :(得分:0)

你的递归方程是正确的。问题与传统的背包问题相同。实际上,您可以对空间复杂性进行一些优化。这是C ++代码。

int dp[M + 10];
int DP{
    memset(dp, 0, sizeof(dp));
    for(int i = 0; i < N; ++i)
        for(int j = M; j >= m[i]; --j) // pay attention
            dp[j] = max(dp[j], dp[j - m[i]] + g[i]);
    int ret = 0;
    for(int i = 0; i <= M; ++i) ret = max(ret, dp[i]);
    return ret;
}