背包问题 II
中文
English
有 n 个物品和一个大小为 m 的背包. 给定数组 A 表示每个物品的大小和数组 V 表示每个物品的价值.
问最多能装入背包的总价值是多大?
样例
样例 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
挑战
O(nm) 空间复杂度可以通过, 不过你可以尝试 O(m) 空间复杂度吗?
注意事项
A[i], V[i], n, m均为整数- 你不能将物品进行切分
- 你所挑选的要装入背包的物品的总大小不能超过
m - 每个物品只能取一次
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 maxvalue[A.size()+1][m+1];
for(int i=0;i<=A.size();i++){
for(int j=0;j<=m;j++){
if(i==0){
maxvalue[0][j]=0;
continue;
}
if(j==0){
maxvalue[i][0]=0;
continue;
}
if(A[i-1]<=j){
maxvalue[i][j]=max(maxvalue[i-1][j],maxvalue[i-1][j-A[i-1]]+V[i-1]);
}
else{
maxvalue[i][j]=maxvalue[i-1][j];
}
}
}
return maxvalue[A.size()][m];
}
};

本文探讨了背包问题的第二种变体,通过动态规划算法解决如何在给定背包容量下,从多个不可分割的物品中选择以获得最大总价值的问题。提供了具体的样例分析及O(nm)空间复杂度的解决方案。

被折叠的 条评论
为什么被折叠?



