题目地址:

http://www.lintcode.com/problem/backpack-ii/description

0−10-10−1背包问题,AAA表示物品体积,VVV表示物品价值,背包容量为mmm,每个物品只能最多选一次,问在不超过背包容量的前提下,最多能装多大价值的物品。

思路是动态规划。设f[i][j]f[i][j]f[i][j]是从A[0:i]A[0:i]A[0:i]这些物品里取出若干总体积不超过jjj的物品的价值最大值。这个最大值有两种可能,要么包含物品iii,此时最大值是f[i−1][j−A[i]]+V[i]f[i-1][j-A[i]]+V[i]f[i−1][j−A[i]]+V[i];要么不包含物品iii,此时最大值是f[i−1][j]f[i-1][j]f[i−1][j]。比较一下这两个最大值取大者,就是f[i][j]f[i][j]f[i][j],即f[i][j]=max⁡{f[i−1][j−A[i]]+V[i],f[i−1][j]}f[i][j]=\max\{f[i-1][j-A[i]]+V[i],f[i-1][j]\}f[i][j]=max{f[i−1][j−A[i]]+V[i],f[i−1][j]}从上面的式子看出,更新顺序是,iii从小到大,jjj也是从小到大。代码如下:

public class Solution {/*** @param m: An integer m denotes the size of a backpack* @param A: Given n items with size A[i]* @param V: Given n items with value V[i]* @return: The maximum value*/public int backPackII(int m, int[] A, int[] V) {// write your code hereint[][] dp = new int[A.length][m + 1];// 考虑第0个物品,只有容量大于等于A[0]的时候才能放进去for (int i = A[0]; i <= m; i++) {dp[0][i] = V[0];}for (int i = 1; i < A.length; i++) {for (int j = 0; j <= m; j++) {dp[i][j] = dp[i - 1][j];if (j >= A[i]) {dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - A[i]] + V[i]);}}}return dp[A.length - 1][m];}
}

时空复杂度O(lAm)O(l_Am)O(lA​m)。

接下来考虑优化空间复杂度。可以看到,f[i][j]f[i][j]f[i][j]的值只取决于上一行正上方元素和上一行左边的元素,所以可以按行滚动做空间优化。每一行需要从右向左更新,否则的话更新到f[i][j]f[i][j]f[i][j]的时候,f[i−1][j−A[i]]f[i-1][j-A[i]]f[i−1][j−A[i]]已经被覆盖掉了,这个时候答案已经得不到了。具体代码如下:

import java.util.Arrays;public class Solution {/*** @param m: An integer m denotes the size of a backpack* @param A: Given n items with size A[i]* @param V: Given n items with value V[i]* @return: The maximum value*/public int backPackII(int m, int[] A, int[] V) {// write your code hereint[] dp = new int[m + 1];for (int i = A[0]; i <= m; i++) {dp[i] = V[0];}for (int i = 1; i < A.length; i++) {for (int j = m; j >= A[i]; j--) {dp[j] = Math.max(dp[j], dp[j - A[i]] + V[i]);}}return dp[m];}
}

时间复杂度不变,空间O(m)O(m)O(m)。

【Lintcode】125. Backpack II相关推荐

  1. 【Lintcode】92. Backpack

    题目地址: https://www.lintcode.com/problem/backpack/description 背包问题.给定一个数组AAA代表每个物品的体积,和一个容积sss,问最多能塞满多 ...

  2. 【Lintcode】562. Backpack IV

    题目地址: https://www.lintcode.com/problem/backpack-iv/description 给定一个数组AAA,代表每个物品的体积,题目保证AAA里的数全是正数并且没 ...

  3. 【Lintcode】018.Subsets II

    题目: Given a list of numbers that may has duplicate numbers, return all possible subsets Notice Each ...

  4. 【动态规划】简单背包问题II

    问题 J: [动态规划]简单背包问题II 时间限制: 1 Sec  内存限制: 64 MB 提交: 127  解决: 76 [提交] [状态] [讨论版] [命题人:admin] 题目描述 张琪曼:& ...

  5. 【LintCode】算法题 1443. 最长AB子串

    描述 给你一个只由字母'A'和'B'组成的字符串s,找一个最长的子串,要求这个子串里面'A'和'B'的数目相等,输出该子串的长度. 这个子串可以为空. s的长度n满足 2<=n<=1000 ...

  6. 【lintcode】树形数据结构之Maxtree, Tree iterator, remove bst node, 优先队列之动态中位数Median, 矩阵dfs之word search II,最大连

    解析 max ksubarray sum:  最大和 of 连续子序列 =>   最大和 of  k份连续子序列 属于dp,30行代码搞定,注意一些边界. substr diff:  无queu ...

  7. 【Lintcode】1382 · High Capacity Backpack

    题目地址: https://www.lintcode.com/problem/1382/description 给定一个背包,容量sss,再给定nnn个物品,各自体积是c[i]c[i]c[i],各自价 ...

  8. 【LintCode】Backpack 背包问题

    在n个物品中挑选若干物品装入背包,最多能装多满?假设背包的大小为m,每个物品的大小为A[i]. 样例 如果有4个物品[2, 3, 5, 7] 如果背包的大小为11,可以选择[2, 3, 5]装入背包, ...

  9. 【Lintcode】444. Graph Valid Tree II

    题目地址: https://www.lintcode.com/problem/444/ 要求设计一个数据结构,可以做如下两个操作: 1.void addEdge(int a, int b)在aaa与b ...

最新文章

  1. Datawhale组队学习周报(第018周)
  2. 【建站系列教程】2.2、fiddler手机抓包教程
  3. Dalvik虚拟机相关的可执行程序
  4. 音视频技术开发周刊 | 134
  5. dgi数据治理_荐书 | 5G时代组织急需数据体检
  6. Teams App设备的地理位置能力
  7. Jsoup代码解读之四-parser(上)
  8. android sdk 安装_Appium+python自动化1-环境安装(上)
  9. 【数据结构与算法】【算法思想】分治算法
  10. 12月29日云栖精选夜读 | SQL Server数据库漏洞评估了解一下
  11. OpenGL ES Emulator横向比较
  12. DPDK学习1 -- DPDK环境搭建和测试helloword
  13. JSP九大内置对象及其使用教程
  14. MyBatis 里面如何配置log4j
  15. 按键精灵大漠找字FindStrFast 函数封装
  16. vue用vue-qart生产二维码
  17. git切换远程分支并拉取最新代码
  18. springboot系列(二十七):如何实现word携带图片导出?这你得会|超级详细,建议收藏
  19. 解决win7下Realtek声卡有噪音的问题
  20. rust怎么建柱子_原神慈盐之末任务怎么做?原神钟离传说任务的方碑柱子点亮顺序...

热门文章

  1. IP广播分控隐私政策
  2. 2021.07.13 我们是这样崩的
  3. Java中的equals()方法
  4. Tief Meer alt singen nennen Papa.Magnam natus consequuntur corporis laudantium.
  5. laravel 事务_【钢结构建筑】gmp建筑师事务所 | 杭州铁路南站
  6. 【Java设计模式 设计模式与范式】创建型模式 四:抽象工厂模式
  7. 光敏二极管和光敏三极管的原理、区别、辨别以及应用电路
  8. 【Flink源码分析】Flink 命令启动全流程
  9. android pm命令不可用,adb命令pm工具讲解
  10. 【阿朱洞察】中国云计算市场未来3年展望(完善版)