LintCode : 背包问题 II

本文介绍了一个经典的背包问题变种——背包问题II,并提供了一种基于动态规划的解决方案。该问题要求在给定背包容量和一系列物品的价值及体积的情况下,求解能够放入背包的最大价值。文章详细解释了状态转移方程,并附带了完整的Java实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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

相关题目 Expand

解题思路: 
典型的动态规划,和上一题的背包问题一致,状态方程有所修改而已
状态方程为  sum[ i ][ j ] = max(sum[ i ][ j-1 ],sum[ i -1 ][ j-A[ i ] ]+V[ i ])
背包问题的动态规划算法参考 http://blog.youkuaiyun.com/dapengbusi/article/details/7463968
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;
     }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值