题目描述:
LintCode——背包问题II有 n 个物品和一个大小为 m 的背包,给定数组 A 表示每个物品的大小和数组 V 表示每个物品的价值。 问最多能装入背包的总价值是多大?
方法1:比较节省空间
class Solution
{
public:
int backPackII(int m, vector<int> &A, vector<int> &V)
{
int n = A.size();
if(n == 0 || m == 0)
return 0;
vector<int> maxV(m + 1, 0);
for(int i = 1; i <= n; i++)
{
for(int j = m; j >= 1; j--)
{
if(A[i - 1] <= j)
{
maxV[j] = max(maxV[j], maxV[j - A[i - 1]] + V[i - 1]);
}
}
}
return maxV[m];
}
};
方法2:传统方法
class Solution
{
public:
int backPackII(int m, vector<int> &A, vector<int> &V)
{
int n = A.size();
if(n == 0 || m == 0)
return 0;
vector<vector<int>> maxV(n + 1, vector<int>(m + 1, 0));
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
if(A[i - 1] > j)
maxV[i][j] = maxV[i - 1][j];
else
maxV[i][j] = max(maxV[i - 1][j], maxV[i - 1][j - A[i - 1]] + V[i - 1]);
}
}
return maxV[n][m];
}
};