背包问题 II
给出n个物品的体积A[i]和其价值V[i],将他们装入一个大小为m的背包,最多能装入的总价值有多大?
您在真实的面试中是否遇到过这个题?
Yes
哪家公司问你的这个题? Airbnb Alibaba Amazon Apple Baidu Bloomberg Cisco Dropbox Ebay Facebook Google Hulu Intel Linkedin Microsoft NetEase Nvidia Oracle Pinterest Snapchat Tencent Twitter Uber Xiaomi Yahoo Yelp Zenefits
感谢您的反馈
样例
对于物品体积[2, 3, 5, 7]和对应的价值[1, 5, 2, 4], 假设背包大小为10的话,最大能够装入的价值为9。
注意
标签 Expand
A[i], V[i], n, m均为整数。你不能将物品进行切分。你所挑选的物品总体积需要小于等于给定的m。
相关题目 Expand
解题思路:
典型的动态规划,和上一题的背包问题一致,状态方程有所修改而已
状态方程为 sum[ i ][ j ] = max(sum[ i ][ j-1 ],sum[ i -1 ][ j-A[ i ] ]+V[ i ])
public class Solution {
/**
* @param m: An integer m denotes the size of a backpack
* @param A & V: Given n items with size A[i] and value V[i]
* @return: The maximum value
*/
public int backPackII(int m, int[] A, int V[]) {
// write your code here
if (A == null || 0 == A.length || m == 0)
return 0;
int len = A.length;
int[][] sum = new int[len][m+1];
for(int i=0;i<len;i++){
sum[i][0] = 0;
}
for(int j=0;j<m+1;j++){
if(j>=A[0]){
sum[0][j] = V[0];
}
}
for(int i=1;i<len;i++){
for(int j=1;j<m+1;j++){
if(j>=A[i]){
sum[i][j] = max(sum[i-1][j], sum[i-1][j-A[i]]+V[i]);
}else{
sum[i][j] = sum[i-1][j];
}
}
}
return sum[len-1][m];
}
public int max(int a, int b) {
return a > b ? a : b;
}
}