【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。
样例
对于物品体积[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]; } }
相关文章推荐
- Mahout--(四)Taste的架构和部署Demo
- 算法的封装与切换——策略模式(一):电影票打折方案
- Hive不同文件的读取与序列化
- collectd配置
- 设计模式--原型模式
- java 重定向和转发的区别
- HTTP协议的C/S模式的信息交换过程
- linux内核list模块的使用
- paint 画笔的一些属性
- 关于VS2010出现“此方法显式使用的 CAS 策略已被 .NET Framework 弃用... ...请使用 NetFx40_LegacySecurityPolicy 配置开关”解决办法
- Swift中NSDictionaryOfVariableBindings的替代方案
- FORM表单中onclick()、submit()与onsubmit()的问题
- Spark1.4从HDFS读取文件运行Java语言WordCounts并将结果保存至HDFS
- PAT (Basic Level) Practise (中文)1036. 跟奥巴马一起编程(15)
- 虚函数—类的多态性
- 如何将Eclipse中的项目迁移到Android Studio 中
- Spark1.4从HDFS读取文件运行Java语言WordCounts并将结果保存至HDFS
- Maven Dependency Scope
- linux 关闭停用ipv6方法
- Java基础--多线程--售票