您的位置:首页 > 其它

LintCode : 背包问题 II

2016-01-27 17:07 337 查看


背包问题 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。

注意

A[i], V[i], n, m均为整数。你不能将物品进行切分。你所挑选的物品总体积需要小于等于给定的m。

标签
Expand
LintCode 版权所有
动态规划
背包问题

相关题目
Expand

解题思路:
典型的动态规划,和上一题的背包问题一致,状态方程有所修改而已
状态方程为 sum[ i ][ j ] = max(sum[ i ][ j-1 ],sum[ i -1 ][ j-A[ i ] ]+V[ i ])
背包问题的动态规划算法参考/article/3665226.html
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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: