我的情况与背包问题非常相似,但我只想确认我的递归方程与背包问题相同。
我们最多投资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
我希望我的解释清楚。
谢谢你,祝你有愉快的一天!
巴比
答案 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;
}