描述
有 n 个物品和一个大小为 m 的背包. 给定数组 A 表示每个物品的大小和数组 V 表示每个物品的价值.
问最多能装入背包的总价值是多大?
A[i], V[i], n, m 均为整数
你不能将物品进行切分
你所挑选的要装入背包的物品的总大小不能超过 m
样例
样例 1:
输入: m = 10, A = [2, 3, 5, 7], V = [1, 5, 2, 4]
输出: 9
解释: 装入 A[1] 和 A[3] 可以得到最大价值, V[1] + V[3] = 9
样例 2:
输入: m = 10, A = [2, 3, 8], V = [2, 5, 8]
输出: 10
解释: 装入 A[0] 和 A[2] 可以得到最大价值, V[0] + V[2] = 10
思路:
表示前
个物品拼成重量
的时候能获得的最大价值,可以得到递推表达式:
考虑最后一个物品是否被装入背包两种情况。具体实现如下。
class Solution {
public:
/**
* @param m: An integer m denotes the size of a backpack
* @param A: Given n items with size A[i]
* @param V: Given n items with value V[i]
* @return: The maximum value
*/
int backPackII(int m, vector<int> &A, vector<int> &V) {
// write your code here
int n=A.size();
if(!n)
{
return 0;
}
vector<vector<int>> dp(n+1,vector<int>(m+1,-1));
dp[0][0]=0;
int res=0;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=m;j++)
{
dp[i][j]=dp[i-1][j];
if(j-A[i-1]>=0 && dp[i-1][j-A[i-1]]!=-1)
{
dp[i][j]=max(dp[i][j],dp[i-1][j-A[i-1]]+V[i-1]);
}
res=max(res,dp[i][j]);
}
}
return res;
}
};