您的位置:首页 > 其它

【LintCode】 Backpack II 背包问题II

2015-07-16 15:36 393 查看
给出n个物品的体积A[i]和其价值V[i],将他们装入一个大小为m的背包,最多能装入的总价值有多大?

样例

对于物品体积[2, 3, 5, 7]和对应的价值[1, 5, 2, 4], 假设背包大小为10的话,最大能够装入的价值为9。

注意

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

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[]) {
if(A == null || null == V || A.length == 0 || V.length == 0 || A.length != V.length) return 0;
int[][] dp = new int[A.length][m + 1];//动态规划矩阵
for(int i = 0; i < A.length; i++) {//背包空间为0时,不管要放第几个物品,可装的物品价值均为0.
dp[i][0] = 0;
}
for(int i = 0; i < A.length; i++) {
for(int j = 1; j < m + 1; j++) {
if(i == 0) {//不管背包空间多大,放第0个物品时
if(A[i] <= j) {//若物品所占空间小于等于背包空间
dp[i][j] = V[i];//则此时背包所装物品价值为该物品价值
}else {//若该物品所占空间大于背包空间
dp[i][j] = 0;//则此时背包所装物品价值为0
}
}else {//当放第1个到第A.length-1个物品时
if(A[i] > j) {//若该物品所占空间大于背包总空间(无论怎样腾背包空间,该物品无法放入背包)
dp[i][j] = dp[i - 1][j];//背包内价值不变
}else{//若该物品所占空间小于等于背包总空间,则需将背包空间腾出至少A[i]后,将该物品放入。放入新物品后背包价值可能更大,也可能还不如原来大,取大值作为背包空间为j且放第i个物品时可以有的最大价值。
dp[i][j] = Math.max(dp[i - 1][j - A[i]] + V[i], dp[i-1][j]);//
}
}
}
}
return dp[A.length - 1][m];
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: