【LintCode】 Backpack II 背包问题II

98 篇文章 0 订阅
11 篇文章 0 订阅

给出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];
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值