【Lintcode】125. Backpack II
题目地址:
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(lAm)。
接下来考虑优化空间复杂度。可以看到,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相关推荐
- 【Lintcode】92. Backpack
题目地址: https://www.lintcode.com/problem/backpack/description 背包问题.给定一个数组AAA代表每个物品的体积,和一个容积sss,问最多能塞满多 ...
- 【Lintcode】562. Backpack IV
题目地址: https://www.lintcode.com/problem/backpack-iv/description 给定一个数组AAA,代表每个物品的体积,题目保证AAA里的数全是正数并且没 ...
- 【Lintcode】018.Subsets II
题目: Given a list of numbers that may has duplicate numbers, return all possible subsets Notice Each ...
- 【动态规划】简单背包问题II
问题 J: [动态规划]简单背包问题II 时间限制: 1 Sec 内存限制: 64 MB 提交: 127 解决: 76 [提交] [状态] [讨论版] [命题人:admin] 题目描述 张琪曼:& ...
- 【LintCode】算法题 1443. 最长AB子串
描述 给你一个只由字母'A'和'B'组成的字符串s,找一个最长的子串,要求这个子串里面'A'和'B'的数目相等,输出该子串的长度. 这个子串可以为空. s的长度n满足 2<=n<=1000 ...
- 【lintcode】树形数据结构之Maxtree, Tree iterator, remove bst node, 优先队列之动态中位数Median, 矩阵dfs之word search II,最大连
解析 max ksubarray sum: 最大和 of 连续子序列 => 最大和 of k份连续子序列 属于dp,30行代码搞定,注意一些边界. substr diff: 无queu ...
- 【Lintcode】1382 · High Capacity Backpack
题目地址: https://www.lintcode.com/problem/1382/description 给定一个背包,容量sss,再给定nnn个物品,各自体积是c[i]c[i]c[i],各自价 ...
- 【LintCode】Backpack 背包问题
在n个物品中挑选若干物品装入背包,最多能装多满?假设背包的大小为m,每个物品的大小为A[i]. 样例 如果有4个物品[2, 3, 5, 7] 如果背包的大小为11,可以选择[2, 3, 5]装入背包, ...
- 【Lintcode】444. Graph Valid Tree II
题目地址: https://www.lintcode.com/problem/444/ 要求设计一个数据结构,可以做如下两个操作: 1.void addEdge(int a, int b)在aaa与b ...
最新文章
- Datawhale组队学习周报(第018周)
- 【建站系列教程】2.2、fiddler手机抓包教程
- Dalvik虚拟机相关的可执行程序
- 音视频技术开发周刊 | 134
- dgi数据治理_荐书 | 5G时代组织急需数据体检
- Teams App设备的地理位置能力
- Jsoup代码解读之四-parser(上)
- android sdk 安装_Appium+python自动化1-环境安装(上)
- 【数据结构与算法】【算法思想】分治算法
- 12月29日云栖精选夜读 | SQL Server数据库漏洞评估了解一下
- OpenGL ES Emulator横向比较
- DPDK学习1 -- DPDK环境搭建和测试helloword
- JSP九大内置对象及其使用教程
- MyBatis 里面如何配置log4j
- 按键精灵大漠找字FindStrFast 函数封装
- vue用vue-qart生产二维码
- git切换远程分支并拉取最新代码
- springboot系列(二十七):如何实现word携带图片导出?这你得会|超级详细,建议收藏
- 解决win7下Realtek声卡有噪音的问题
- rust怎么建柱子_原神慈盐之末任务怎么做?原神钟离传说任务的方碑柱子点亮顺序...
热门文章
- IP广播分控隐私政策
- 2021.07.13 我们是这样崩的
- Java中的equals()方法
- Tief Meer alt singen nennen Papa.Magnam natus consequuntur corporis laudantium.
- laravel 事务_【钢结构建筑】gmp建筑师事务所 | 杭州铁路南站
- 【Java设计模式 设计模式与范式】创建型模式 四:抽象工厂模式
- 光敏二极管和光敏三极管的原理、区别、辨别以及应用电路
- 【Flink源码分析】Flink 命令启动全流程
- android pm命令不可用,adb命令pm工具讲解
- 【阿朱洞察】中国云计算市场未来3年展望(完善版)